如何在使用c#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

我得到了Protobuf net的源代码,它将一个对象序列化为一个文件

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++谷歌的协议缓冲区是否容易被抛弃?