如何使用c# protobuf-net在序列化时向文件追加对象

本文关键字:文件 追加 对象 序列化 何使用 protobuf-net | 更新日期: 2023-09-27 18:02:36

我得到了一个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实例,我想将它们序列化到一个文件中。我该怎么做呢?

如何使用c# protobuf-net在序列化时向文件追加对象

protobuf,在纯粹意义上,除了文件末尾没有任何"终止符"(这是为了简单地通过连接blob来合并/组合对象)。

但是,我们可以注入自己的标记,例如,在每个对象前面加上后面数据的长度。

protobuf-net通过暴露一个SerializeWithLengthPrefix方法完成了这一点。有多种方法可以从中反序列化,但最简单的是DeserializeItems,它依次为您提供对象的流序列(从迭代器中的流中懒洋洋地假脱机-因此它非常适合非常大的序列)。

对于信息,所以你可以看到这是如何实现的:如果你使用PrefixStyle.Base128和一个正的fieldNumber,那么在电线上这看起来就像你有一个包装器对象一样:

[ProtoContract]
public class DoesNotExist {
    [ProtoMember({fieldNumber})]
    public List<Person> People {get;set;}
}

关键的区别在于没有实际的DoesNotExist类型/实例存在,也没有创建List<T>—您只得到Person实例。