我正在尝试使用protobuf.net。
我已经从here下载了最新版本,实施了[ProtoContract]
课程,现在我正在尝试使用ProtoBuf.Serializer.Serialize
对其进行序列化,如documentation中所述。问题是,没有这样的方法。
如何将[ProtoContract]
写入磁盘?
更新
显然,我有错误的版本或其他东西,但这是我的Serialize
类的样子:
答案 0 :(得分:27)
这必须帮助您开始使用它: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<Person>(file, person);
}
但是大多数时候我们可以让编译器的泛型类型推断为我们工作。 反序列化数据
我们还需要退回数据!
Person newPerson;
using (var file = File.OpenRead("person.bin")) {
newPerson = Serializer.Deserialize<Person>(file);
}
这将从“person.bin”中读取数据。注意我们需要告诉它这次的类型(),否则代码非常相似。
答案 1 :(得分:7)
听起来你已经选择了“CoreOnly”版本,可能适用于iOS或Unity?这意味着您正在使用谷歌代码下载。在该软件包的根目录中是“我需要什么文件.txt”,它解释了不同版本的用途。你可能应该使用“完整”版本。或者更简单地说,使用仅包含“完整”构建的NuGet部署。
如果你想使用“CoreOnly”,你可能应该使用单独的“预编译”工具来生成自定义序列化器,然后:
var ser = new MyCustomSerializer();
ser.Serialize(...);
此方案主要用于Windows Phone,Silverlight,iOS等轻量级框架,其中元编程/反射非常有限或完全不允许。