34

我正在尝试开始使用 protobuf.net。

我已经从这里下载了最新版本,实现了一个[ProtoContract]类,现在我正在尝试按照文档ProtoBuf.Serializer.Serialize中的描述对其进行序列化进行序列化。问题是,没有这样的方法。

如何写入[ProtoContract]磁盘?

更新 显然,我有错误的版本或其他东西,但这是我的Serialize班级的样子:

我看到的 protobuf.net 序列化程序类

4

2 回答 2

31

这必须帮助您开始使用它:Source & Credit & Marc Gravell


最简单的入门方法就是编写数据:

class Person {
    public int Id {get;set;}
    public string Name {get;set;}
    public Address Address {get;set;}
}
class Address {
    public string Line1 {get;set;}
    public string Line2 {get;set;}
}

这是一个好的开始,但对于 protobuf-net 来说,这本身是不够的。与 XmlSerializer 不同,成员名称未在数据中编码 - 相反,您必须选择一个整数来标识每个成员。此外,为了表明意图,有必要表明我们打算将这种类型序列化(即它是一个数据协定):

[ProtoContract]
class Person {
    [ProtoMember(1)]
    public int Id {get;set;}
    [ProtoMember(2)]
    public string Name {get;set;}
    [ProtoMember(3)]
    public Address Address {get;set;}
}
[ProtoContract]
class Address {
    [ProtoMember(1)]
    public string Line1 {get;set;}
    [ProtoMember(2)]
    public string Line2 {get;set;}
}

由于“protocol buffers”是一种二进制格式,protobuf-net 主要基于 Stream 类;这使得使用各种实现变得简单。例如,要写入文件:

var person = new Person {
    Id = 12345, Name = "Fred",
    Address = new Address {
        Line1 = "Flat 1",
        Line2 = "The Meadows"
    }
};
using (var file = File.Create("person.bin")) {
    Serializer.Serialize(file, person);
}

这会将一个 32 字节的文件写入“person.bin”。在上面可能并不明显,但 Serialize 是一种通用方法 - 该行也可以是:

using (var file = File.Create("person.bin")) {
    Serializer.Serialize<Person>(file, person);
}

但大多数时候我们可以让编译器的泛型类型推断为我们完成这项工作。反序列化数据

我们还需要找回数据!

Person newPerson;
using (var file = File.OpenRead("person.bin")) {
    newPerson = Serializer.Deserialize<Person>(file);
}

这将从“person.bin”中读取数据。注意我们这次需要告诉它类型(the ),否则代码非常相似。


更新:下载这个包 一切似乎都很好

于 2013-01-26T10:21:13.620 回答
10

听起来您已经选择了一个“CoreOnly”构建,可能适用于 iOS 或 Unity?这意味着您正在使用 google-code 下载。该软件包的根目录中有一个“我需要什么文件.txt”,它解释了不同构建的用途。您可能应该使用“完整”构建。或者更简单地说,使用仅包含“完整”构建的 NuGet 部署。

如果您想使用“CoreOnly”,您可能应该使用单独的“预编译”工具来生成自定义序列化程序,然后:

 var ser = new MyCustomSerializer();
 ser.Serialize(...);

此方案主要用于 Windows Phone、Silverlight、iOS 等轻框架 - 其中元编程/反射要么非常有限,要么完全不允许。

于 2013-01-26T10:42:35.090 回答