파생 역 직렬화,하지만 난 예상대로 역 직렬화되지 않습니다 일부 개체, 건너했습니다.오류가 나는 레디 스에 저장하기 전에 객체를 직렬화하고/역 직렬화하는 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; }
}
'Base'유형을 기대하는 일부 종속 프로젝트가 있으므로'DummyBase '을 반환하는 것이 내가 원하는 것은 아니지만 올바른 방향으로 나를 가리키고 있습니다. 기본 클래스에는 추가 속성과 메서드가 있지만 'DummyBase'를 제네릭 클래스와 비 제너릭 클래스의 기반으로 만드는 것이 효과적입니다. –