开始使用protobuf-net

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

我从这里下载了最新版本,实现了[ProtoContract]类,现在我正在尝试使用ProtoBuf.Serializer.Serialize将其序列化,如文档中所述。 问题是,没有这样的方法。

如何将[ProtoContract]写入磁盘?

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

我看到protobuf.net Serializer类

这必须帮助您开始使用它: 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;} } 

由于“协议缓冲区”是二进制格式,因此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(file, person); } 

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

我们还需要退出数据!

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

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


更新: 下载此软件包 一切似乎都很好

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

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

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

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