问题标签 [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.
serialization - protobuf-net 不比二进制序列化快吗?
我编写了一个程序来使用 XMLSerializer、BinaryFormatter 和 ProtoBuf 序列化一个“Person”类。我认为 protobuf-net 应该比其他两个更快。Protobuf 序列化比 XMLSerialization 快,但比二进制序列化慢得多。我的理解不正确吗?请让我明白这一点。感谢您的帮助。
编辑:-我更改了代码(在下面更新)以仅测量序列化的时间而不是创建流并且仍然看到差异。有人能告诉我为什么吗?
以下是输出:-
在 347 毫秒内使用协议缓冲区创建人员
Person 在 1462 毫秒内使用 XML 创建
在 2 毫秒内使用二进制创建人
下面的代码
c# - 是否需要在公共方法上声明属性 [DataMember(Order=n)]?
在我的解决方案中,我创建了公共类来存储值并已经声明了 [DataContract/DataMember] 属性。
例如,
}
然后我需要添加另一个公开方法来暴露整个项目。我想知道我是否必须为此添加 [DataMember(Order = 3)]。
我知道如果我想在 protobuf-net 中使用序列化程序来序列化我存储的数据,我必须声明这些属性。但我不确定方法上的那个。
请帮忙。先感谢您。
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
。
如果我在散列函数中替换ToInt32
为ToInt16
,则字段值设置为29723
并且可以正常工作。如果我将System.String
' 字段明确定义为1
. 显式定义该字段与600542181
使用散列函数定义它具有相同的效果。被序列化的字符串的值不会改变结果。
c# - 动态对象序列化
我试图用 序列化一个DynamicObject
类BinaryFormatter
,但是:
- 输出文件太大,不完全友好
- 未处理循环引用(序列化时卡住)
由于序列化DynamicObject
本身意义不大,这是我尝试序列化的类:
(我想我可以使用 ExpandoObject,但那是另一回事了。)
这是一个简单的测试程序:
在这里和那里放置一些断点有助于我查看 obj2 的内容,看起来原始数据已正确反序列化,但如果您富有想象力并四处移动数据,则会出现上述缺点。
我查看了 Marc Gravell 的 protobuf-net,但我不确定如何在这种情况下使用它(我什至不确定我是否从存储库中选择了正确的版本,但是嘿)。
我知道代码多于文字,但我认为我无法更好地解释这个场景。请告诉我是否可以添加一些内容以使这个问题更清楚。
任何帮助深表感谢。
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 位的愿望。)
serialization - 使用 Protobuf-net,如果它们相同,它是否允许反序列化重用现有实例?
我正在使用 Protobuf-net。假设我有一个序列化的 Gizmo 对象列表,并且每个 Gizmo 对象都引用一个 Gazoo 对象。Gazoo 对象可能是多个 Gizmo 对象引用的同一对象。
在这种情况下,反序列化将如何工作?
对于 Gizmo 对象中的同一个引用,我会获得多个 Gazoos 副本吗?
我期望的是一份 Gazoo 副本,用于序列化数据中的所有重复项。
c# - List 的 .proto 等价物是什么在protobuf-net中?
为了保持一定的一致性,我们为很多对象模型使用代码生成,其中一个分支是通过单独的生成模块为 ProtocolBuffers 生成 .proto 文件。不过,在这一点上,我对如何在List<T>
对象发生时实现生成感到困惑。
看起来这可以通过合同实现:
但除此之外,我不确定如何或是否可以仅通过创建 .proto 文件/使用 VS 自定义工具来做到这一点。有什么想法吗?
c# - Protobuf-net 和泛型
我对 protobuf-net 和泛型的使用有疑问。
鉴于:
具有通用 int 列表的 CacheLoadItem 可以很好地序列化,但具有通用字符串列表的 CacheLoadItem 不会。
我认为这与通用列表首先被序列化有关。
具有通用字符串列表的 CacheLoadItem 包含正确数量的项目,但具有默认/空值。
有谁知道为什么会这样?
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
c# - 如何使用 protobuf .NET 序列化接口类型的成员?
以下测试失败并出现此错误:
“System.InvalidOperationException:找不到合适的默认 IB 编码。”
我正在使用 Protobuf.net 的这个实现:
http://code.google.com/p/protobuf-net/
我错过了什么?非常感谢你。