首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原型-网络文档或备选方案

原型-网络文档或备选方案
EN

Stack Overflow用户
提问于 2013-09-15 19:16:41
回答 3查看 1.4K关注 0票数 6

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

然而,我在开始的时候遇到了困难。文档(在github上的wiki)非常稀少,特别是对于v2。

不知怎么的,你们这些家伙似乎可以自由行动了。多么?通过阅读消息来源?试错?还是有一些API文档/教程我不知道?(我只知道GitHib页面。)

谢谢,干杯,

1月

P.S.:我需要开始使用RuntimeTypeModel (POCO的无属性)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-15 20:28:33

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

代码语言:javascript
复制
class Customer {
    public int Id {get;set;}
    public string Name {get;set;}
}

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

代码语言:javascript
复制
RuntimeTypeModel.Default.Add(typeof(Customer), false).Add("Id", "Name");

它将Id与1相关联,Name与2相关联。当使用属性时,有一些内置的“自己解决”代码,我应该在非属性API上公开这些代码,比如:

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

但是,这两种方法都很简单,与反射有关。请注意,在这两种情况下,如果类型可能在某一时刻发生更改,使用反射是遇到问题的好方法。

可能会有所帮助的其他特性,我可以提供更多关于以下内容的信息:

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

Stack Overflow用户

发布于 2013-09-16 11:53:02

既然你还问过其他选择..。

不需要属性修饰是使用简单API创建移民、快速序列化库的原因之一。该图书馆也有一些想法也存在于protobuf中(因此我们在速度和大小上或多或少地相差无几),但同时也试图解决不同的问题。在与protobuf不同的特性中,空集合和空集合之间有区别,整个序列化是基于引用的,而值是基于值的(嗯,您也可以将引用看作一种特殊的值)。github的README应该能够回答您的大部分问题;是否需要更详细的信息,只需问一问。

自定义对象序列化的简单场景:

代码语言:javascript
复制
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

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

票数 6
EN

Stack Overflow用户

发布于 2016-02-23 23:32:17

另一个选择是达舍尔 (可通过NuGet获得)。

它是一个简单、快速和轻量级的.NET序列化器和反序列化器,可以在C#类型上工作,而不需要任何属性或其他修饰。

代码语言:javascript
复制
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稍大,但它确实意味着您可以解码接收到的任何消息,包括属性名称、类型和值。

免责声明:我写了图书馆。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18816467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档