【问题标题】:C# MongoDB driver serialization - Working with binariesC# MongoDB 驱动程序序列化 - 使用二进制文件
【发布时间】:2014-06-25 20:51:51
【问题描述】:

我有一个“复杂”类,其中包含一个我想序列化为二进制文件的属性:

public class MyClassA{
  public MyClassB myClassB {get;set;}
  public MyClassB myClassC {get;set;}
  [BsonIgnore]
  public MyClassB myClassD {get;set;}
  private byte[] myClassDBin {get;set}
}

我想只在 RAM 中保留 myClassD 对象,但我也想只序列化 myClassDBin 对象。第一个条件很容易在 custructor 中实现:

public class MyClassA{
  public MyClassB myClassB {get;set;}
  public MyClassB myClassC {get;set;}
  [BsonIgnore]
  public MyClassB myClassD {get;set;}
  private byte[] myClassDBin {get;set}

  [BsonConstructor]
  public MyClassA(MyClassB myClassB, MyClassC myClassC, MyClassDBin[] myClassDBin)
  {
     this.myClassB = myClassB;
     this.myClassC = myClassC;
     this.myClassDBin = myClassBin;
     if(this.myClassDBin != null)
     {
        using(MemoryStream stream = new MemoryStream(this.myClassDBin))
        {
           this.myClassD = myClassD.Load(stream);//custom serializer
        }
     }
     this.myClassDBin = null; //Keep only one object in RAM
  }
}

这对于反序列化非常有效,但是序列化呢?如果我希望 myClassDBin 被序列化,我需要它始终不为空。我需要实现自定义序列化程序吗?这可能是一项漫长的任务,因为类 myClassB/C/D 是大类,使用 automapper 很容易......有没有像 XML 一样的接口,我们可以在序列化之前实现?

【问题讨论】:

    标签: c# mongodb serialization


    【解决方案1】:

    我以为我必须实现整个序列化程序,但我从 Robert Sam 那里读到了 this post,这对我很有帮助。我只是写了一个自定义序列化程序:

    internal class MesureSerializer : IBsonSerializer
    {
      private readonly IBsonSerializer _classMapSerializer;
    
      public MesureSerializer()
      {
         var classMap = BsonClassMap.LookupClassMap(typeof(MyClassA));
         _classMapSerializer = new BsonClassMapSerializer(classMap);
      }
    
      object IBsonSerializer.Deserialize(MongoDB.Bson.IO.BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
      {
         return _classMapSerializer.Deserialize(bsonReader, nominalType, actualType, options);
      }
    
      void IBsonSerializer.Serialize(MongoDB.Bson.IO.BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
      {
         MyClassA item = (MyClassA)value;
         if(item.myClassD != null)
         {
            using(MemoryStream stream = new MemoryStream())
            {
               item.myClassD.Save(item.myClassD, stream);
               mesure.myClassDBin = stream.ToArray();
            }
         }
         else
         {
            item.myClassDBin = null;
         }
         _classMapSerializer.Serialize(bsonWriter, nominalType, item, options);
         item.myClassDBin = null;
      }
    
    
      object IBsonSerializer.Deserialize(MongoDB.Bson.IO.BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options)
      {
         return _classMapSerializer.Deserialize(bsonReader, nominalType, options);
      }
    
      IBsonSerializationOptions IBsonSerializer.GetDefaultSerializationOptions()
      {
         return _classMapSerializer.GetDefaultSerializationOptions();
      }
    }
    

    就这么简单!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多