【问题标题】:How to make C# classes protobuf-net-serializable without referencing protobuf-net?如何在不引用 protobuf-net 的情况下使 C# 类 protobuf-net-serializable?
【发布时间】:2013-07-17 09:33:04
【问题描述】:

首先,我真的很喜欢 protobuf-net,因为它的速度和易用性。 现在我正在开发一个 .NET 类库,并希望在不实际引用它的情况下使我的一些类 protobuf-net-ready,因为:

  1. 我不知道我的客户会使用哪个环境,所以我不知道该选择哪个 protobuf-net 二进制文件
  2. 我想最小化占用空间(也许它们根本不需要序列化)

据我了解,这可以通过手动编写 .proto 文件来完成。谁能解释我或给一个链接如何做到这一点?有没有办法从属性描述生成 .proto 文件?以及客户端序列化/反序列化代码会是什么样子?

【问题讨论】:

    标签: protocol-buffers protobuf-net


    【解决方案1】:

    据我了解,这可以通过手动编写 .proto 文件来完成

    不;这没有必要,也无济于事。

    假设您目前有一个类型:

    [ProtoContract]
    public class Foo {
        [ProtoMember(1)]
        public int Bar {get;set;}
        // ...
    }
    

    有两种选择可以做你想做的事:

    1. 使用内置的平台属性,例如:

      [DataContract]
      public class Foo {
          [DataMember(Order=1)]
          public int Bar {get;set;}
          // ...
      }
      

      [XmlType]
      public class Foo {
          [XmlElement(Order=1)]
          public int Bar {get;set;}
          // ...
      }
      
    2. 在运行时显式配置模型(在模型尝试使用 Foo 之前):

      RuntimeTypeModel.Default.Add(typeof(Foo), false).Add(1, "Bar");
      

      (当然,后者在某些时候仍需要您与ProtoBuf 交谈,但它不需要您的 POCO 类型了解序列化)

    其中任何一个都应该有效。

    【讨论】:

    • 感谢您的回答!但现在我有另一个问题:不幸的是,我的类型看起来像列表:(所以我需要“IgnoreListHandling = true”,而且似乎我不能用 DataContract 属性来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多