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

如何序列化/反序列化列表<;MyClass>;使用protobuf-netc#,c#,protobuf-net,C#,Protobuf Net,我有一个简单的类,比如 public class Customer{ public long Id; public string Name; .... } 我有一个列表,我想使用protobuf net序列化它。请指导我简单有效的序列化和反序列化方法 编辑-1 我在看protobuf net源代码中提供的单元测试,它使用两种方式进行序列化,使用反射和模型(它在内部处理基于ToString的映射) 我从源代码中遵循的是,我使用了与源代码的项目文件夹e-ProtoBufNetWithMode

我有一个简单的类,比如

public class Customer{
 public long Id;
 public string Name;
 ....
}
我有一个列表,我想使用protobuf net序列化它。请指导我简单有效的序列化和反序列化方法

编辑-1 我在看protobuf net源代码中提供的单元测试,它使用两种方式进行序列化,使用反射和模型(它在内部处理基于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;
        }

    }
使用protobuf(IList pSource)序列化公共静态流
{
var model=CreateModel();
使用(Stream memoryStream=new memoryStream())
{
序列化(memoryStream,pSource);
返回内存流;
}
}
TypeModel compiled=model.Compile()上,它引发异常
检测到重复的字段编号;1

简本 (另请参见旧主页)

序列化是一种痛苦。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);
//写入文件
序列化(outputStream,person);
...
//从文件中读取
var person=序列化程序。反序列化(inputStream);
哦,而且速度很快;无论是在CPU和带宽

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

序列化数据 由于“协议缓冲区”是一种二进制格式,protobuf网络主要基于流类;这使得可以简单地与各种各样的实现一起使用。例如,要写入文件,请执行以下操作:

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);
    }
使用(var file=file.Create(“person.bin”)){
序列化器。序列化(文件、人员);
}
但大多数情况下,我们可以让编译器的泛型类型推断为我们完成工作

反序列化数据 我们还需要把数据拿回来

 Person newPerson;
    using (var file = File.OpenRead("person.bin")) {
        newPerson = Serializer.Deserialize<Person>(file);
    }
Person-newPerson;
使用(var file=file.OpenRead(“person.bin”)){
newPerson=序列化程序。反序列化(文件);
}

这将从“person.bin”读回数据。注意,这次我们需要告诉它类型(the),但是代码非常相似。

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

嘿,阿西夫,请先阅读不,复制和粘贴并不是一个真正的问题answer@MarcGravell是的,这是一个符合他需要的答案无论如何,我将代表stackoverflow向您补充+1我会说“不,这使我们在版权方面处于尴尬的境地”。作为本案的版权所有人,我不太可能发布删除通知——但是:如果你不想增加任何价值,出于这两方面的原因,链接应该是首选。