如何序列化/反序列化列表<;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
要序列化的每个字段都需要一个不同的标记(一个正整数)。调用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),但除此之外,代码非常相似。