6

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

但是,我在开始时遇到了麻烦。文档(github 上的 wiki)非常稀少,尤其是对于 v2。

不知何故,你们那里似乎能够使用lib。如何?通过阅读来源?试错?还是有一些我不知道的 API 文档/教程?(我只知道 GitHib 页面。)

谢谢和欢呼,

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

4

3 回答 3

6

由于您还询问了替代方案...

不需要属性修饰是使用简单 API 创建Migrant快速序列化库的原因之一。该库的一些想法也存在于 protobuf 中(因此我们在速度和大小方面或多或少是相当的),但同时尝试解决不同的问题。在与 protobuf 不同的特性中,空集合和 null 集合之间存在区别,并且整个序列化是基于引用的引用和基于值的值(当然,您也可以将引用视为一种特殊的值)。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);

请注意,expected type inDeserialize仅用于具有良好的反序列化对象的编译时类型,您也可以使用 general object

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

于 2013-09-16T11:53:02.757 回答
2

在 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 和Name2 相关联。使用属性时,有一些内置的“自己弄清楚”代码,我应该在非属性 API 上真正公开这些代码 - 例如:

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

但是:这两者都非常简单,与反射有关。请注意,在任何一种情况下,如果类型可能在某些时候发生变化,使用反射是解决问题的好方法。

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

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

另一种选择是Dasher(可通过NuGet获得)。

它是用于 .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 略大,但这确实意味着您可以解码收到的任何消息,包括属性名称、类型和值。

免责声明:我写了这个库。

于 2016-02-23T23:32:17.810 回答