Protobuf-net 似乎是最快的,并且对于高性能需要最推荐的 .NET 序列化库。我真的很想使用它,因为我需要通过网络发送数十万个对象。
但是,我在开始时遇到了麻烦。文档(github 上的 wiki)非常稀少,尤其是对于 v2。
不知何故,你们那里似乎能够使用lib。如何?通过阅读来源?试错?还是有一些我不知道的 API 文档/教程?(我只知道 GitHib 页面。)
谢谢和欢呼,
简
PS:我需要开始使用 RuntimeTypeModel(没有属性的 POCO)。
Protobuf-net 似乎是最快的,并且对于高性能需要最推荐的 .NET 序列化库。我真的很想使用它,因为我需要通过网络发送数十万个对象。
但是,我在开始时遇到了麻烦。文档(github 上的 wiki)非常稀少,尤其是对于 v2。
不知何故,你们那里似乎能够使用lib。如何?通过阅读来源?试错?还是有一些我不知道的 API 文档/教程?(我只知道 GitHib 页面。)
谢谢和欢呼,
简
PS:我需要开始使用 RuntimeTypeModel(没有属性的 POCO)。
由于您还询问了替代方案...
不需要属性修饰是使用简单 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
。
免责声明:我是开发人员之一。
在 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 上真正公开这些代码 - 例如:
但是:这两者都非常简单,与反射有关。请注意,在任何一种情况下,如果类型可能在某些时候发生变化,使用反射是解决问题的好方法。
可能有帮助的其他功能,我可以提供更多信息:
它是用于 .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 略大,但这确实意味着您可以解码收到的任何消息,包括属性名称、类型和值。
免责声明:我写了这个库。