protobuf-net文档或替代方案

Kna*_*ack 6 .net serialization protobuf-net

Protobuf-net似乎是最快的,并且对于高性能需要最推荐的.NET序列化库.我真的很想使用它,因为我需要通过线路发送数十万个对象.

但是,我开始时遇到了麻烦.文档(github上的wiki)非常稀疏,特别是对于v2.

不知怎的,你们那里似乎能够开始使用lib.怎么样?通过阅读消息来源?试错了?或者是否有一些我不知道的API文档/教程?(我只知道GitHib页面.)

谢谢和欢呼,

一月

PS:我需要使用RuntimeTypeModel(没有属性的POCO).

kon*_*ski 6

既然你也问过替代品......

不需要属性修饰是创建具有简单API的Migrant,快速序列化库的原因之一.图书馆有一些想法也存在于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);
Run Code Online (Sandbox Code Playgroud)

请注意,期望的类型Deserialize仅用于具有反序列化对象的良好编译时类型,您也可以使用常规类型object.

免责声明:我是开发人员之一.


Mar*_*ell 2

在 protobuf 中,类型的每个成员都需要一个标识号,因为 protobuf 是基于数字的(它不发送名称)。因此,技巧很简单:告诉它要使用什么数字。例如:

class Customer {
    public int Id {get;set;}
    public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

为此指定合同的最简单方法是:

RuntimeTypeModel.Default.Add(typeof(Customer), false).Add("Id", "Name");
Run Code Online (Sandbox Code Playgroud)

这将Id与 1 和Name2 相关联。使用属性时,有一些内置的“自己弄清楚”代码,我应该在非属性 API 上公开这些代码 - 例如:

  • 按字母顺序序列化所有公共字段+属性
  • 按字母顺序序列化所有字段(公共或非公共)

然而:这两者都可以通过反射来实现,非常简单。请注意,无论哪种情况,如果类型可能在某个时刻发生变化,那么使用反射都是遇到问题的好方法。

可能有帮助的其他功能,我可以提供更多信息:

  • 可以指定类型工厂(全局或每个实例),这对于预填充值或使用可用对象池非常有用
  • 可以为复杂的场景编写代理类型 - 当大多数模型工作正常,但一种类型太深奥而不适合序列化时,这很有用 - 但可以设计另一种布局,您可以在其中编写转换代码两个方向
  • 默认情况下,许多看起来像“元组”的东西都会被处理 - 特别是,如果它是公开不可变的,并且有一个接受与所有公共成员匹配的参数的构造函数 - 它将假定按照指定的顺序序列化成员构造函数