如何序列化/反序列化列表<;MyClass>;使用protobuf-net C#

本文关键字:gt MyClass 使用 protobuf-net lt 反序列化 列表 序列化 | 更新日期: 2023-09-27 17:57:50

我有一个类似的简单类

public class Customer{
 public long Id;
 public string Name;
 ....
}

我有一个List,我想使用protobuf-net对它进行序列化。请指导我简单高效的序列化和反序列化方法。

编辑-1我查看了protobuf-net源代码中可用的单元测试,它使用了两种序列化方式,使用反射和Model(它在内部处理基于ToString的映射)。

我从源代码中得到的是,我使用了与在源代码的项目文件夹e-ProtoBufNetWithModel中测试的技术相同的技术,并创建了一个TypeModel。。。

public static TypeModel CreateModel()
    {
        RuntimeTypeModel model = TypeModel.Create();
        model.Add(typeof(Customer), false)
        .Add(1, "Id")
        .Add(1, "Name");
        TypeModel compiled = model.Compile();
        return compiled;
    }

问题区域

 public static Stream SerializeUsingProtobuf(IList<Customer> pSource)
    {
        var model = CreateModel();
        using (Stream memoryStream = new MemoryStream())
        {
            model.Serialize(memoryStream, pSource);
            return memoryStream;
        }
    }

TypeModel compiled = model.Compile();上,它引发异常检测到重复的字段编号;1

如何序列化/反序列化列表<;MyClass>;使用protobuf-net C#

要序列化的每个字段都需要一个不同的标记(一个正整数)。调用Add时,请尝试使用1和2,而不是1和1。或者更简单,只需添加("Id","Name");

https://code.google.com/p/protobuf-net/

简短版本(另请参阅旧主页)

序列化是一种痛苦。protobuf-net设计用于在现有代码上轻松使用,只需最少的更改(从可选的.proto模式更改),从而在各种.net平台上实现快速且可移植的二进制序列化。

它不是"恰好在.NET上的协议缓冲区实现",而是"恰好使用协议缓冲区的.NET序列化程序"——重点是熟悉.NET用户(例如,如果需要,可以处理可变的代码优先类)。除了常规的protobuf设计之外,我还添加了一系列常见的功能,以帮助满足.NET程序员的日常需求(继承、引用跟踪等)。

用法非常简单;在最基本的层面上,简单地从流中读取或写入流;请参阅入门:

// write to a file
Serializer.Serialize(outputStream, person);
...
// read from a file
var person = Serializer.Deserialize<Person>(inputStream);

哦,而且速度很快;在CPU和带宽方面。

如果你想在visualstudio中使用.proto文件,有一些VS工具,但你不需要——你可以写一个类,告诉序列化程序如何使用它(最常见的是添加一些属性,但这取决于你),然后序列化。

https://code.google.com/p/protobuf-net/wiki/GettingStarted

序列化数据由于"协议缓冲区"是一种二进制格式,protobuf-net主要基于Stream类;这使得可以简单地与各种各样的实现一起使用。例如,要写入文件:

var person=新人{Id=12345,Name="Fred",地址=新地址{Line1="平面1",Line2="草地"}};使用(var file=file.Create("person.bin")){序列化程序。序列化(文件,个人);}

这将一个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"中读取数据。注意,我们需要告诉它这次的类型(the),但除此之外,代码非常相似。