Protobuf似乎是最快的,而且对于高性能的需要,.NET最推荐的序列化库。我真的很想使用它,因为我需要通过网络发送成千上万的对象。
然而,我在开始的时候遇到了困难。文档(在github上的wiki)非常稀少,特别是对于v2。
不知怎么的,你们这些家伙似乎可以自由行动了。多么?通过阅读消息来源?试错?还是有一些API文档/教程我不知道?(我只知道GitHib页面。)
谢谢,干杯,
1月
P.S.:我需要开始使用RuntimeTypeModel (POCO的无属性)。
发布于 2013-09-15 20:28:33
在protobuf中,每个类型的成员都需要一个标识号,因为protobuf是基于数字的(它不发送名称)。因此,诀窍很简单:告诉它要使用什么数字。例如:
class Customer {
public int Id {get;set;}
public string Name {get;set;}
}为此指定合同的最简单方法是:
RuntimeTypeModel.Default.Add(typeof(Customer), false).Add("Id", "Name");它将Id与1相关联,Name与2相关联。当使用属性时,有一些内置的“自己解决”代码,我应该在非属性API上公开这些代码,比如:
但是,这两种方法都很简单,与反射有关。请注意,在这两种情况下,如果类型可能在某一时刻发生更改,使用反射是遇到问题的好方法。
可能会有所帮助的其他特性,我可以提供更多关于以下内容的信息:
发布于 2013-09-16 11:53:02
既然你还问过其他选择..。
不需要属性修饰是使用简单API创建移民、快速序列化库的原因之一。该图书馆也有一些想法也存在于protobuf中(因此我们在速度和大小上或多或少地相差无几),但同时也试图解决不同的问题。在与protobuf不同的特性中,空集合和空集合之间有区别,整个序列化是基于引用的,而值是基于值的(嗯,您也可以将引用看作一种特殊的值)。github的README应该能够回答您的大部分问题;是否需要更详细的信息,只需问一问。
自定义对象序列化的简单场景:
var stream = new MyCustomStream();
var myComplexObject = new MyComplexType(complexParameters);
var serializer = new Serializer();
serializer.Serialize(myComplexObject, stream);
stream.Seek(0, SeekOrigin.Begin);
var myDeserializedObject = serializer.Deserialize<MyComplexType>(stream);注意,Deserialize中的预期类型仅用于反序列化对象的良好编译时类型,您也可以使用通用object。
免责声明:我是开发人员之一。
发布于 2016-02-23 23:32:17
它是一个简单、快速和轻量级的.NET序列化器和反序列化器,可以在C#类型上工作,而不需要任何属性或其他修饰。
var stream = new MemoryStream();
// serialise to stream
new Serialiser<Holiday>().Serialise(stream, christmas);
stream.Position = 0;
// deserialise from stream
var christmas = new Deserialiser<Holiday>().Deserialise(stream);它使用反射发射在运行时产生高度优化的序列化和反序列化功能。底层编码是MsgPack,它是自我描述的,比线路上的protobuf稍大,但它确实意味着您可以解码接收到的任何消息,包括属性名称、类型和值。
免责声明:我写了图书馆。
https://stackoverflow.com/questions/18816467
复制相似问题