2017-03-28 4 views
1

파생 역 직렬화,하지만 난 예상대로 역 직렬화되지 않습니다 일부 개체, 건너했습니다.오류가 나는 레디 스에 저장하기 전에 객체를 직렬화하고/역 직렬화하는 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); 
    } 
} 

직렬화 후 중단 점을 설정, 비주얼 스튜디오는 목록으로 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 때문에 일하는 것 같다. getters 및 setter Base<T> 그냥 랩 Base.Value 래핑하십시오. DummyBase<T>은 ServiceStack에서 문자열을 올바른 형식으로 deserialize하는 데 필요합니다. Base<T>Base에서 상속되지 않은 경우

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; } 
} 

은 물론, 모든이 필요하지 않을 것입니다.

+0

'Base '유형을 기대하는 일부 종속 프로젝트가 있으므로'DummyBase '을 반환하는 것이 내가 원하는 것은 아니지만 올바른 방향으로 나를 가리키고 있습니다. 기본 클래스에는 추가 속성과 메서드가 있지만 'DummyBase'를 제네릭 클래스와 비 제너릭 클래스의 기반으로 만드는 것이 효과적입니다. –