【问题标题】:Is it possible to serialize complex object with Protocol Buffers C# (ProtoBuf-net)是否可以使用 Protocol Buffers C# (ProtoBuf-net) 序列化复杂对象
【发布时间】:2011-05-10 15:26:20
【问题描述】:

是否可以在不使用 Protocontract 和 proto 文件的情况下使用 Protocol Buffers C# (ProtoBuf-net) 序列化复杂对象?

[ProtoBuf.ProtoContract(ImplicitFields = ProtoBuf.ImplicitFields.AllPublic)]

我曾尝试使用 ProtoContract,但即便如此我也无法序列化对象(它是一个 LLBLGen ORM 对象)。

【问题讨论】:

    标签: c# protocol-buffers llblgenpro


    【解决方案1】:

    是的;这里有多种选择;

    • 首先,请注意,如果添加成员,“隐式字段”会很脆弱,因为它必须做出比我想要的更多的猜测;仅将其与稳定的合约一起使用
    • 您可以通过 GlobalSettings全局 应用默认行为,但我倾向于不建议这样做
    • protobuf-net v1 也可以使用:
      • XmlType/XmlElement 属性对,只要 XmlElement 指定一个 Order
      • DataContract/DataMember 属性对,只要 DataMember 指定一个 Order
      • 部分类;即使对于属性,通过 ProtoPartialMember 属性等
    • protobuf-net v2 可以 100% 使用,无需任何类型的属性,通过使用 TypeModel 来描述有趣的类型在运行时;如果需要,这也可以将模型编译为专用的序列化 dll(特别是用于依赖 AOT 的设备)

    我可以提供更多建议,但提供了许多选项;告诉我哪个/最合适,我可以添加更多细节。

    重新 .proto 文件;对于 protobuf-net,这些是(并且一直是)完全可选,因为我认识到在很多情况下,代码优先方法(或对现有模型进行序列化改造)很有用.当然,如果您选择使用 .proto,三个代码生成器。

    【讨论】:

    • 嗨,我没有使用 .proto 文件,DataContracts,我已经删除了“隐式字段”我已经从你的存储库下载了 v2,我无法序列化我生成的任何实体由 LLBLGen Pro 提供。这是我正在使用的代码:
    • ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(DAL.EntityClasses.RequestExaminationEntity), true); ProtoBuf.Serializer.PrepareSerializer<DAL.EntityClasses.RequestExaminationEntity>(); ProtoBuf.Serializer.Serialize(m, DataSource[0]); byte[] arrProto = m.ToArray(); var entity = ProtoBuf.Serializer.Deserialize<DAL.EntityClasses.RequestExaminationEntity>(new MemoryStream(arrProto));
    • 序列化后字节[] 长度为零。并感谢您的快速回复:)
    • @khorvat 它仍然需要知道要序列化哪些成员(以及使用哪些标签) - 如果没有属性来指导它,“true”(默认值)将无法应用任何内容。您应该能够将成员添加到 MetaType?我还需要向该 API 添加一个“隐式字段”选项...
    • 我正在通过电子邮件向您发送我无法上班的样本,我显然遗漏了一些东西。您能否看一下代码并指出要解决的问题。由于我使用的是 ORM 工具并且我不能使用任何属性,所以我使用的是 v2.2 版本。我还必须更改 MetaType 类(构造函数是内部的)以动态添加成员。谢谢
    猜你喜欢
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多