Kna*_*ack 6 .net serialization protobuf-net
Protobuf-net似乎是最快的,并且对于高性能需要最推荐的.NET序列化库.我真的很想使用它,因为我需要通过线路发送数十万个对象.
但是,我开始时遇到了麻烦.文档(github上的wiki)非常稀疏,特别是对于v2.
不知怎的,你们那里似乎能够开始使用lib.怎么样?通过阅读消息来源?试错了?或者是否有一些我不知道的API文档/教程?(我只知道GitHib页面.)
谢谢和欢呼,
一月
PS:我需要使用RuntimeTypeModel(没有属性的POCO).
既然你也问过替代品......
不需要属性修饰是创建具有简单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
.
免责声明:我是开发人员之一.
在 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 和Name
2 相关联。使用属性时,有一些内置的“自己弄清楚”代码,我应该在非属性 API 上公开这些代码 - 例如:
然而:这两者都可以通过反射来实现,非常简单。请注意,无论哪种情况,如果类型可能在某个时刻发生变化,那么使用反射都是遇到问题的好方法。
可能有帮助的其他功能,我可以提供更多信息: