sha*_*afi 3 c# serialization protocol-buffers
我有这个类Person,我想要它的几个实例,我想在一个文件中序列化它们.我该怎么做?我不能创建一个列表Person然后序列化它.我希望可以反序列化一个保存的类实例(例如保存的第四个实例).我该怎么做?
人员类:
[ProtoContract]
class Person
{
public Person()
{ }
[ProtoMember(1)]
public int a;
public Person(int d)
{
a = d;
}
}
Run Code Online (Sandbox Code Playgroud)
序列化的方法:
public void serialize()
{
Person p1 = new Person(1);
Person p2 = new Person(2);
Person p3 = new Person(3);
Person p4 = new Person(4);
Person p5 = new Person(5);
FileStream file = File.Create("person.bin") ;
Serializer.Serialize(file, p1);
Serializer.Serialize(file, p2);
Serializer.Serialize(file, p3);
Serializer.Serialize(file, p4);
Serializer.Serialize(file, p5);
file.Close();
}
Run Code Online (Sandbox Code Playgroud)
反序列化的方法:
public void deserialize()
{
Person nP1, nP2,nP3,nP4,nP5;
FileStream file = File.OpenRead("person.bin");
nP1 = Serializer.Deserialize<Person>(file);
nP2 = Serializer.Deserialize<Person>(file);
nP3 = Serializer.Deserialize<Person>(file);
nP4 = Serializer.Deserialize<Person>(file);
nP5 = Serializer.Deserialize<Person>(file);
file.Close();
}
Run Code Online (Sandbox Code Playgroud)
"协议缓冲区"格式未终止(这是由Google的设计,因此可以通过串联合并消息).这样做的副作用是,如果您只是多次序列化,则反序列化会将其全部视为一条消息.幸运的是,protobuf-net可以很容易地做你想做的事情:
Serializer.SerializeWithLengthPrefix(file, p1, PrefixStyle.Base128, 1);
Serializer.SerializeWithLengthPrefix(file, p2, PrefixStyle.Base128, 1);
// etc
Run Code Online (Sandbox Code Playgroud)
和:
nP1 = Serializer.DeserializeWithLengthPrefix<Person>(file,PrefixStyle.Base128,1);
nP2 = Serializer.DeserializeWithLengthPrefix<Person>(file,PrefixStyle.Base128,1);
// etc
Run Code Online (Sandbox Code Playgroud)
另一种方法是创建一个包装器对象 - 一个PersonWrapper或者People你想要调用它的任何东西 - 它封装了你想要序列化的所有东西.这可以是一个List<Person>属性Person0,也可以是单个属性Person1等.
var wrapper = new PersonWrapper { ... };
Serializer.Serialize(file, wrapper);
//...
var wrapper = Serializer.Deserialize<PersonWrapper>(file);
Run Code Online (Sandbox Code Playgroud)
最后,您可以序列化一个列表:
List<Person> people = ...
Serializer.Serialize(file, people);
...
var people = Serializer.Deserializer<List<Perosn>>(file);
Run Code Online (Sandbox Code Playgroud)