2014-04-11 25 views
1

我有一个简单的类象如何序列化/反序列名单<MyClass>使用protobuf网C#

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

我有一个名单,我想使用protobuf网连载了。请指导我简单高效地对此进行序列化和反序列化。

EDIT-1 我对着可用与protobuf网的源代码的单元测试,它使用2种方式进行序列化,采用反射,并用模型(其在内部处理根据的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

+0

嘿asif,请先阅读[你有什么试用/](http://mattgemmell.com/what-have-you-tried/) – JPVenson

+0

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

回答

1

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

1

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和带宽。

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

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

序列化数据 由于“协议缓冲区”是二进制格式,protobuf网在很大程度上基于周围Stream类;这使得简单地使用各种各样的实现成为可能。例如,要写入文件:

变种人=新的Person { 标识= 12345,NAME = “弗雷德”, 地址=新地址{ 线路1 = “平1”, 2号线=“草甸“ } };使用(var file = File.Create(“person.bin”)){ Serializer.Serialize(file,person); }

这会将32字节文件写入“person.bin”。它可能不是在上面明显,但序列化是一种通用的方法 - 行也可能是:

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),否则代码非常相似。

+0

不,复制和粘贴并不是一个真正的答案 –

+0

@MarcGravell是的,如果它符合他的需求就是一个答案。 ;)无论如何,我会加给你+1 –

+0

以及代表stackoverflow我会说“不,这使我们处于一个尴尬的版权条款”。作为这种情况下的版权所有者,我不太可能发布删除通知 - 但是:如果您没有增加任何价值,则应该由于这两个原因而优先选择链接。 –

相关问题