问题标签 [protobuf-net]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
11016 浏览

serialization - protobuf-net 不比二进制序列化快吗?

我编写了一个程序来使用 XMLSerializer、BinaryFormatter 和 ProtoBuf 序列化一个“Person”类。我认为 protobuf-net 应该比其他两个更快。Protobuf 序列化比 XMLSerialization 快,但比二进制序列化慢得多。我的理解不正确吗?请让我明白这一点。感谢您的帮助。

编辑:-我更改了代码(在下面更新)以仅测量序列化的时间而不是创建流并且仍然看到差异。有人能告诉我为什么吗?

以下是输出:-

在 347 毫秒内使用协议缓冲区创建人员

Person 在 1462 毫秒内使用 XML 创建

在 2 毫秒内使用二进制创建人

下面的代码

0 投票
3 回答
1805 浏览

c# - 是否需要在公共方法上声明属性 [DataMember(Order=n)]?

在我的解决方案中,我创建了公共类来存储值并已经声明了 [DataContract/DataMember] 属性。

例如,

}

然后我需要添加另一个公开方法来暴露整个项目。我想知道我是否必须为此添加 [DataMember(Order = 3)]。

我知道如果我想在 protobuf-net 中使用序列化程序来序列化我存储的数据,我必须声明这些属性。但我不确定方法上的那个。

请帮忙。先感谢您。

0 投票
2 回答
7243 浏览

c# - 如何跨 Protobuf 发送多种类型的对象?

我正在实现一个客户端-服务器应用程序,并且正在研究各种序列化和传输数据的方法。我开始使用 Xml 序列化器,它工作得很好,但是生成数据很慢,并且会生成大型对象,尤其是当它们需要通过网络发送时。所以我开始研究 Protobuf 和 protobuf-net。

我的问题在于 protobuf 没有发送类型信息。使用 Xml 序列化器,我能够构建一个包装器,该包装器将通过同一流发送和接收任何各种(可序列化)对象,因为序列化为 Xml 的对象包含对象的类型名称。

我已经考虑了一些解决方案,包括创建一个主“状态”类型类,这是通过我的套接字发送的唯一类型的对象。不过,这偏离了我使用 Xml 序列化程序开发的功能,所以我想避免这个方向。

第二种选择是将 protobuf 对象包装在某种类型的包装器中,该包装器定义了对象的类型。(这个包装器还包括数据包 ID 和目的地等信息。)使用 protobuf-net 序列化一个对象,然后将该流粘贴在 Xml 标记之间似乎很愚蠢,但我已经考虑过了。有没有一种简单的方法可以从 protobuf 或 protobuf-net 中获取此功能?


我想出了第三种解决方案,并在下面发布,但如果您有更好的解决方案,请也发布!


有关字段边界错误的信息(使用 System.String):

散列:

序列化:

反序列化:

field => _mappings[field]扔了一KeyNotFoundException会寻找63671269

如果我在散列函数中替换ToInt32ToInt16,则字段值设置为29723并且可以正常工作。如果我将System.String' 字段明确定义为1. 显式定义该字段与600542181使用散列函数定义它具有相同的效果。被序列化的字符串的值不会改变结果。

0 投票
5 回答
41097 浏览

c# - 动态对象序列化

我试图用 序列化一个DynamicObjectBinaryFormatter,但是:

  • 输出文件太大,不完全友好
  • 未处理循环引用(序列化时卡住)

由于序列化DynamicObject本身意义不大,这是我尝试序列化的类:

(我想我可以使用 ExpandoObject,但那是另一回事了。)

这是一个简单的测试程序:

在这里和那里放置一些断点有助于我查看 obj2 的内容,看起来原始数据已正确反序列化,但如果您富有想象力并四处移动数据,则会出现上述缺点。

我查看了 Marc Gravell 的 protobuf-net,但我不确定如何在这种情况下使用它(我什至不确定我是否从存储库中选择了正确的版本,但是嘿)。

我知道代码多于文字,但我认为我无法更好地解释这个场景。请告诉我是否可以添加一些内容以使这个问题更清楚。

任何帮助深表感谢。

0 投票
1 回答
504 浏览

protobuf-net - protobuf-net v2 alpha - 字典问题?

几周前,我非常成功地使用了 v2 的 protobuf-net 版本。(由于在 Compact Framework 上运行的预编译序列化程序的速度,我想使用 V2。)在我尝试序列化具有 Dictionary 类型属性的对象之前,一切都很好。我收到以下错误:

{“没有为类型定义序列化程序:System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0 .0.0,文化=中性,PublicKeyToken=b77a5c561934e089]]"}

看起来最近为改进字典支持做了一些更改,所以我从今天开始获取最新的代码。在构建 CF3.5 和 FF3.5 dll 后,我再次尝试。现在我收到一个不同的错误“模型一旦冻结就无法更改”。如果我从 Dictionary 属性中删除 ProtoMember 属性,一切似乎都运行良好。

有没有人在 protobuf-net 的 v2 中成功使用字典?这是否还为时过早,无法使用?我的速度测试显示 v2 的速度是原来的两倍,这看起来是否准确(验证了我使用不太稳定的 v2 pre-alpha 位的愿望。)

0 投票
1 回答
1033 浏览

serialization - 使用 Protobuf-net,如果它们相同,它是否允许反序列化重用现有实例?

我正在使用 Protobuf-net。假设我有一个序列化的 Gizmo 对象列表,并且每个 Gizmo 对象都引用一个 Gazoo 对象。Gazoo 对象可能是多个 Gizmo 对象引用的同一对象。

在这种情况下,反序列化将如何工作?

对于 Gizmo 对象中的同一个引用,我会获得多个 Gazoos 副本吗?

我期望的是一份 Gazoo 副本,用于序列化数据中的所有重复项。

0 投票
1 回答
1731 浏览

c# - List 的 .proto 等价物是什么在protobuf-net中?

为了保持一定的一致性,我们为很多对象模型使用代码生成,其中一个分支是通过单独的生成模块为 ProtocolBuffers 生成 .proto 文件。不过,在这一点上,我对如何在List<T>对象发生时实现生成感到困惑。

看起来这可以通过合同实现:

但除此之外,我不确定如何或是否可以仅通过创建 .proto 文件/使用 VS 自定义工具来做到这一点。有什么想法吗?

0 投票
1 回答
1327 浏览

c# - Protobuf-net 和泛型

我对 protobuf-net 和泛型的使用有疑问。

鉴于:

具有通用 int 列表的 CacheLoadItem 可以很好地序列化,但具有通用字符串列表的 CacheLoadItem 不会。

我认为这与通用列表首先被序列化有关。

具有通用字符串列表的 CacheLoadItem 包含正确数量的项目,但具有默认/空值。

有谁知道为什么会这样?

0 投票
1 回答
4158 浏览

protobuf-net - 为什么我必须使用 [ProtoInclude]?

我已经阅读了很多关于 protobuf-net 中继承特性的问题。我只是想知道是否可以像使用 [ProtoContract]、[ProtoMember] 一样使用 [DataContract]、[DataMember]。为什么我不能使用 [KnowType] 而不是使用 [ProtoInclude]?

我提出这个问题是因为我已经使用 [DataContract],[DataMember] 进行 protobuf-net 的序列化。无需添加“Protobuf-net”。它仅使用“System.Runtime.Serialization”。

但是......现在如果我的类需要从某个类继承,我是否必须为 [ProtoInclude] 属性添加“Protobuf-net”?例如,

最后,我想知道我是否有 100 个子类,在基类中添加 100 个 [ProtoInclude] 标签会不会让我发疯?

谢谢你的帮助

ve

0 投票
1 回答
3214 浏览

c# - 如何使用 protobuf .NET 序列化接口类型的成员?

以下测试失败并出现此错误:

“System.InvalidOperationException:找不到合适的默认 IB 编码。”

我正在使用 Protobuf.net 的这个实现:

http://code.google.com/p/protobuf-net/

我错过了什么?非常感谢你。