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