2017-03-28 9 views
1

私はServiceStack.Textを使ってオブジェクトをレディスに格納する前にシリアル化/逆シリアル化しますが、オブジェクトを渡してしまいます。ServiceStack.Textを使用して派生ジェネリックタイプを逆シリアル化するときのエラー

私はオブジェクト型のプロパティを持つ基本型(この基本型を使用する多くのプロジェクトを持つ旧式のコードのビット)を持っています。後でジェネリック型の基本型が追加され、ジェネリック型としてプロパティが公開されました。

ServiceStack.Textを使用してジェネリック型をシリアライズおよびデシリアライズすると、派生クラスの特定の型ではなく、基本クラス(型オブジェクト)のプロパティが設定されます。の値で

class Program 
{ 
    public class Base<T> : Base 
    { 
     //hide the Value property on the base class 
     public new T Value { get; set; } 
    } 

    public class Base 
    { 
     public object Value { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     var a = new Base<List<string>>() 
     { 
      Value = new List<string>() { "one", "two", "three" }, 
     }; 

     var serialized = TypeSerializer.SerializeToString(a); 
     var deserialized = TypeSerializer.DeserializeFromString<Base<List<string>>>(serialized); 

     //throws a null ref exception 
     Console.WriteLine(deserialized.Value.Count); 
    } 
} 

のデシリアライズ後にブレークポイントを設定すると、Visual Studioが一覧としてbase.Valueを持つオブジェクトを示し<文字列>を:

エラーを再現するための簡単なコンソールアプリケーションは、このようなものが行きます私のベースの値のプロパティ<リスト<文字列> >クラスはnullです。

Screenshot of debugger in Visual Studio

TypeSerializer(またはJsonSerializer)が正しく、より特定のプロパティの代わりに、基本クラスのプロパティに設定するように設定する方法はありますか?

何か助けていただければ幸いです。回答に基づいて


更新

は、私は、新しい抽象基本クラスからBase<T>Base継承を行うことによってそれを解決したので、のような:

public abstract class DummyBase 
{ 
    public string Test { get; set; } = "Test"; 
} 

public class BaseResponse<T> : DummyBase 
{ 
    public T Value { get; set; } 
} 

public class BaseResponse : DummyBase 
{ 
    public object Value { get; set; } 
} 

答えて

1

にもかかわらずBase.Value隠されていても、まだ反映されています(例:a.GetType().GetProperties())。

follお仕事がうまくいくようです。ゲッターとセッターはBase<T>にちょうどラップBase.Valueです。 ServiceStackで文字列を正しい型に逆シリアル化するには、DummyBase<T>が必要です。もちろん

class Program 
{ 
    public static void Main (string[] args) 
    { 
     var a = new Base<List<string>>() 
     { 
      Value = new List<string> { "one", "two", "three" }, 
     }; 

     var serialized = TypeSerializer.SerializeToString(a); 
     var deserialized = TypeSerializer.DeserializeFromString<DummyBase<List<string>>>(serialized); 

     // no longer throws a null ref exception 
     Console.WriteLine(deserialized.Value.Count); 
    } 
} 

public class DummyBase<T> 
{ 
    public T Value { get; set; } 
} 

public class Base<T> : Base 
{ 
    public new T Value 
    { 
     get { return (T)base.Value; } 
     set { base.Value = value; } 
    } 
} 

public class Base 
{ 
    public object Value { get; set; } 
} 

Base<T>Baseから継承されていなかった場合は、すべてこれは必要ではないでしょう。

+0

私は 'Base 'のタイプを期待する依存プロジェクトをいくつか持っていますので、 'DummyBase 'を返すのは私の望むものではありませんが、正しい方向に私を指摘しました。基本クラスには追加のプロパティとメソッドがありますが、 'DummyBase'をジェネリッククラスと非ジェネリッククラスの両方の基底にすることで動作します。 –

関連する問題