2016-08-11 3 views
1

さまざまなデータ型(DateTime、int、decimal、string)のオブジェクトのリストがあります。 プロトコルバッファを使用してSystem.Objectオブジェクトのリストをシリアル化することは可能ですか

List<object> myObjects = new List<object>(); 
myObjects.Add(3); 
myObjects.Add(3.9m); 
myObjects.Add(DateTime.Now); 
myObjects.Add("HELLO"); 

は私がいるProtobuf-ネット使用して、このリストをシリアル化することができたが、直列化復元は常に例外をスローします:「追加情報:Typeが期待されていない、と何の契約を推測することはできない:System.Objectの」。

using (var ms = new MemoryStream()) 
{ 
    Serializer.Serialize(ms, list2); 
    var bytes = ms.ToArray(); 
    ms.Position = 0; 
    var clone = Serializer.Deserialize(typeof(List<object>), ms); //Throws exception 
} 

私は明白な契約を結んでいません、それは問題だと思いますか?しかし、私はどのような種類のシリアル化されたオブジェクトが予想されるのか分かりますが、どうやってprotobuf-netに伝えますか?

答えて

3

これは移動するための方法である理由はこれらをチェックしてください:

いるProtobufの作成者によって
  1. The need for a parameterless constructor

  2. why dynamic instead of object wouldn't have worked

  3. なぜDynamicType=truewouldn't have worked

  4. the need for an abstract base class and concrete implementations、 -net

  5. why no serializer for object

抽象ベース

[ProtoContract] 
    [ProtoInclude (1, typeof(ObjectWrapper<int>))] 
    [ProtoInclude(2, typeof(ObjectWrapper<decimal>))] 
    [ProtoInclude(3, typeof(ObjectWrapper<DateTime>))] 
    [ProtoInclude(4, typeof(ObjectWrapper<string>))] 
    abstract class ObjectWrapper { 
     protected ObjectWrapper() {} 
     abstract public object ObjectValue { get; set; } 
    } 

実装

[ProtoContract()] 
    class ObjectWrapper<T> : ObjectWrapper 
    { 
     public ObjectWrapper(): base() { } 
     public ObjectWrapper(T t) { this.Value = t; } 

     [ProtoIgnore()] 
     public override object ObjectValue 
     { 
      get { return Value; } 
      set { Value = (T)value; } 
     } 

     [ProtoMember(1)] 
     public T Value { get; set; } 
    } 

テスト

 var myObjects = new List<ObjectWrapper>(); 
     myObjects.Add(new ObjectWrapper<int>(3)); 
     myObjects.Add(new ObjectWrapper<decimal>(3.9m)); 
     myObjects.Add(new ObjectWrapper<DateTime> (DateTime.Now)); 
     myObjects.Add(new ObjectWrapper<string> ("HELLO")); 
     var clone = Serializer.DeepClone(myObjects); 
関連する問題