如何在使用c#protobuf net序列化时将对象附加到文件?
我得到了Protobuf net的源代码,它将一个对象序列化为一个文件如何在使用c#protobuf net序列化时将对象附加到文件?,c#,file,serialization,protobuf-net,C#,File,Serialization,Protobuf Net,我得到了Protobuf net的源代码,它将一个对象序列化为一个文件 var person = new Person { Id = 12345, Name = "Fred", Address = new Address { Line1 = "Flat 1", Line2 = "The Meadows" } }; using (var file = File.Create("perso
var person = new Person {
Id = 12345, Name = "Fred",
Address = new Address {
Line1 = "Flat 1",
Line2 = "The Meadows"
}
};
using (var file = File.Create("person.bin")) {
ProtoBuf.Serializer.Serialize(file, person);
}
但假设我有两个Person实例,我想将它们序列化到一个文件中。如何做到这一点?protobuf,从纯意义上讲,除了文件的结尾之外,没有任何“终止符”(这样,只需连接blob,就可以合并/组合对象) 然而,我们可以注入我们自己的标记,例如通过在每个对象前面加上后面数据的长度 protobuf net通过公开
SerializeWithLengthPrefix
方法来包装这一点。有多种方法可以从中进行反序列化,但最简单的方法是反序列化项
,它依次为您提供对象的流序列(在迭代器中从流延迟假脱机-因此它非常适合于非常大的序列)
有关信息,请参见如何实现:如果使用PrefixStyle.Base128
和一个正的fieldNumber
,那么在连线上,这看起来就像有一个包装器对象,如:
[ProtoContract]
public class DoesNotExist {
[ProtoMember({fieldNumber})]
public List<Person> People {get;set;}
}
[协议]
公共阶层的实干家{
[原成员({fieldNumber})]
公共列表人员{get;set;}
}
关键的区别在于没有实际的
DoesNotExist
类型/实例存在,也没有创建列表
——您只需要得到个人
实例。我得到了解决方案,这要感谢Marc GravelMarc。您能回答字段编号(最后一个参数)(值=0)的影响吗在Serializer.SerializeWithLengthPrefix中(s,command1,PrefixStyle.Base128,0)@Rezoan这主要适用于使用Base128
前缀时;如果提供了正数,那么前缀的写入方式将使整个复合流本身成为有效的protobuf流,如DoesNotExist
示例所示。这种方法的一个有趣用途是,它允许您将异构对象写入同一个流,并按顺序将它们删除-即,您可以编写人
、顺序、人、人、人,然后是地址。您需要使用非泛型API和类型解析程序将这些从流中移除,但它对于…@Rezoan…诸如基于消息的套接字或RPC之类的东西来说非常方便;每个操作都可以有不同的字段号,您可以分别处理这些字段号。我个人总是喜欢包含字段号,因为我喜欢整个流都是有效的protobufthanks。我会很快给你回复另一个问题=请澄清我在问一个问题@Marc。如果我使用c#protbuf net将这个person对象序列化为一个文件。使用C++谷歌的协议缓冲区是否容易被抛弃?