데이터 클래스의 직렬화 및 역 직렬화가 필요한 기존보고 인터페이스에 대한 원격 연결을 구현해야합니다. 다음은 클래스 및 인터페이스의 단순화 된 버전입니다.
public interface IBase
{
string Name { get; }
}
public interface IDerived1
{
int Value { get; }
}
public interface IDerived2
{
bool Value { get; }
}
public class Base : IBase
{
public string Name { get; protected set; }
}
public class Derived1 : Base, IDerived1
{
public int Value { get; protected set; }
}
public class Derived2 : Base, IDerived2
{
public bool Value { get; protected set; }
}
입력 매개 변수로
IEnumerable<IBase> reportingData
따라서이 컬렉션에는 'Derived1'및 'Derived2'인스턴스의 개수와 조합이 포함될 수 있습니다. 그런 다음 컬렉션을 다음과 같이 직렬화합니다.
string serialisedReportingData = JsonConvert.SerializeObject( reportingData );
예를 들어 다음과 같습니다.
[{ "값": 11, "이름": "제품 번호"}, { "값": false, "이름": "출력 1 활성화 됨"}]
분명히이 데이터만으로는 개별 컬렉션 항목의 유형이 JSON에 없기 때문에 역 직렬화가 불가능합니다. 예를 들어 JSON의 형식 부분을 만들거나 역 직렬화 중에 사용할 추가 형식 컬렉션을 제공 할 수 있습니다.
처리하기 전에 CustomCreationConverter 오버로드를 사용했습니다.
JsonConvert.DeserializeObject<IEnumerable<Ixxx>>( ... );
그러나 이것은 IEnumerable 내의 단일 인터페이스 유형에만 적용됩니다. 위의 예제에는 IDerived1과 IDerived2가 있습니다.
내 질문 / 문제 :
a) 하나 이상의 인터페이스 유형을 다루는 CustomCreationConverter가 어떻게 작성 될 수 있는지 잘 모르겠고 여기에 유형을 가져 오는 방법을 모릅니다.
b) 입력으로받은 'IEnumerable reportingData'와 동일한 역 직렬화 출력을 제공하는 솔루션을 구현하는 방법에 대한 귀하의 제안을 사랑합니다.
가능한 경우 작업 코드 예제를 감사하겠습니다.
미리 감사드립니다, Christian
업데이트 : (dbc의 의견에서 영감을 얻음)
형식 이름으로 역 직렬화 할 때는 SerializationBinder를 사용해야 합니다. KnownTypesBinder에 대해서는 여기를 참조하십시오 . (Newtonsoft.Json 버전 10 이상이 필요합니다)
먼저 속성을 설정하려면 속성을 만들어야합니다 public
. 그런 다음 a JsonSerializerSettings
를 사용 하여 직렬화 / 비 직렬화 할 수 있습니다 .
List<IBase> loList = new List<IBase>();
loList.Add(new Base() { Name = "Base" });
loList.Add(new Derived1() { Name = "Derived1", Value = 3 });
loList.Add(new Derived2() { Name = "Derived2", Value = true });
KnownTypesBinder loKnownTypesBinder = new KnownTypesBinder()
{
KnownTypes = new List<Type> { typeof(Base), typeof(Derived1), typeof(Derived2) }
};
IEnumerable<IBase> reportingData = loList.AsEnumerable();
JsonSerializerSettings loJsonSerializerSettings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Objects,
SerializationBinder = loKnownTypesBinder
};
string lsOut = JsonConvert.SerializeObject(reportingData, loJsonSerializerSettings);
reportingData = JsonConvert.DeserializeObject<IEnumerable<IBase>>(lsOut, loJsonSerializerSettings);
그런 식으로 사용 JsonSerializerSettings
하면 json 문자열에 유형 정보가 포함됩니다.
[{
"$type": "Base",
"Name": "Base"
}, {
"$type": "Derived1",
"Value": 3,
"Name": "Derived1"
}, {
"$type": "Derived2",
"Value": true,
"Name": "Derived2"
}
]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다