将数据反序列化为protobuf类

时间:2016-07-05 09:52:34

标签: c# mongodb xml-serialization protocol-buffers

我正在尝试将Mongodb中的数据反序列化为由protoc(版本3)创建的MyClass。

我正在使用MongoDB.Driver(版本4) BsonSerializer.Deserialize(result,MyClass.GetType()); 它使用XmlSerializer反序列化数据。

问题在于protobuf如何代表其馆藏。 列表创建为Google.Protobuf.Collections.RepeatedField 没有setter 。 XmlSerializer无法反序列化没有setter的字段。 如何以一种不会成为丑陋黑客的方式来解决这个问题呢?

我提出的选项:

  1. 创建我自己的Serializer,MongoDB可以使用它来处理没有setter的属性。
  2. 创建我自己的类生成器,添加公共setter。
  3. 在MongoDB的序列化数据和protobufs类之间创建一个新类作为映射器。
  4. 选项1似乎令人生畏,选项2让我创建一个新的分支,这是一个难以维护。选项3是迄今为止最简单的,但也是凌乱的,如果有更好的方法来解决这个问题,我不想创建另一层复杂性。

    所以我的问题是:

    还有其他方法可以解决这个问题吗?我有什么遗失已经内置的,或者我错过了一些微不足道的事情吗?

    编辑: 这是protoc verison 3生成的内容的片段:

    /// <summary>Field number for the "Recipients" field.</summary>
    public const int RecipientsFieldNumber = 5;
    private static readonly pb::FieldCodec<string> _repeated_recipients_codec = 
        pb::FieldCodec.ForString(42);
    private readonly pbc::RepeatedField<string> recipients_ = new   pbc::RepeatedField<string>();
    public pbc::RepeatedField<string> Recipients {
      get { return recipients_; }
    }
    

    它来自这个原型文件:

    syntax = "proto3";
    package DataModels.Data;
    
    message MailTemplateMessage {
        string UUID = 1;
        string SubjectLine = 2; 
        string Body = 3;
        string Sender = 4;
        repeated string Recipients = 5;
    }
    

0 个答案:

没有答案