DataContractSerializer
과 함께 직렬화를 사용하고 있습니다. Dictionary<string, IKnownTypesProvider>
의 필드를 가지는 오브젝트입니다. IKnownTypesProvider
는 어떤 타입인지 알고 있습니다. 그래서 기존 객체를 직렬화하는데 쉽게 사용할 수 있습니다. 하지만 나중에 deserialize하려는 경우 DataContractSerializer
에 알려진 형식 목록을 전달해야하지만 해당 형식의 개체가 serialize 될 때 어떤 형식이 사용되었는지 알지 못하기 때문에이를 수행 할 수 없습니다. MSDN의 모든 합성 샘플은 같은 메서드에서 동일한 형식의 개체를 직렬화 및 비 직렬화하여이 문제를 방지합니다. 그것을 우회하는 방법을 제안 할 수 있습니까? 또는 그런 문제가없는 serialization/deserialization의 다른 메커니즘을 제안 할 수 있습니까?직렬화와 비 직렬화간에 직렬화 관련 정보를 저장하는 가장 좋은 방법
UPD : @ I4V는 Json.NET을 사용하도록 제안되었습니다. 그러나 여기가 실패한 나의 예가있다. 초기 코드는 잊어 버리십시오. 다음은 예입니다
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace TestConsoleProject
{
internal class Program
{
private static void Main(string[] args)
{
var external = new External();
external.Dictionary.Add(100, new Internal() {InternalCount = 100});
external.Dictionary.Add(200, new DerivedInternal() {InternalCount = 200, DerivedInternalCount = 200});
var settings = new JsonSerializerSettings() {TypeNameHandling = TypeNameHandling.All};
var json = JsonConvert.SerializeObject(external, settings);
Console.WriteLine(json);
var otherExternal = JsonConvert.DeserializeObject<External>(json);
Console.WriteLine(otherExternal.Dictionary[200].GetType());
Console.ReadLine();
}
private class External
{
public Dictionary<int, Internal> Dictionary { get; set; }
public External()
{
Dictionary = new Dictionary<int, Internal>();
}
}
private class Internal
{
public int InternalCount { get; set; }
}
private class DerivedInternal : Internal
{
public int DerivedInternalCount { get; set; }
}
}
} 당신은 사전에 두 번째 객체가 아니라 단지 내부 따라서 내가 필요한 데이터를 잃어버린 DerivedInternal
로서 직렬화 (오른쪽입니다)하지만 직렬화 복원되는 것을 볼 수 있습니다. 나는 그것을 어떻게 든 고칠 수 있냐?
내 업데이트 질문 – Demarsch
를 참조하십시오 사용할 수 있습니다. **'var otherExternal = JsonConvert.DeserializeObject (json, settings);'** :) –
I4V
죄송합니다, 그냥 눈치 채 셨습니다 :) 감사합니다! – Demarsch