开始使用protobuf-net

Ars*_*ray 32 c# protobuf-net

我正在尝试使用protobuf.net.

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

我该如何写入[ProtoContract]磁盘?

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

我看到protobuf.net Serializer类

PaR*_*RaJ 29

这必须帮助您开始使用它:Source&CreditMarc 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;}
}
Run Code Online (Sandbox Code Playgroud)

这是一个良好的开端,但对于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;}
}
Run Code Online (Sandbox Code Playgroud)

由于"协议缓冲区"是二进制格式,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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我们还需要退出数据!

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

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


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

  • r282只是最后的v1版本; 这里的答案不仅仅是"使用r282" - 如果使用得当,以后的版本工作得很好. (2认同)

Mar*_*ell 8

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

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

 var ser = new MyCustomSerializer();
 ser.Serialize(...);
Run Code Online (Sandbox Code Playgroud)

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