2013-08-23 4 views
0

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로서 직렬화 (오른쪽입니다)하지만 직렬화 복원되는 것을 볼 수 있습니다. 나는 그것을 어떻게 든 고칠 수 있냐?

답변

2

당신은 (내 대답을 참조) 역 직렬화하는 동안 'settings`를 사용하지 않는 @Demarsch Json.Net

var settings = new JsonSerializerSettings() { 
        TypeNameHandling = TypeNameHandling.All }; 

var json = JsonConvert.SerializeObject(obj, settings); 
var newObj = JsonConvert.DeserializeObject<SomeType>(json, settings); 
+0

내 업데이트 질문 – Demarsch

+0

를 참조하십시오 사용할 수 있습니다. **'var otherExternal = JsonConvert.DeserializeObject (json, settings);'** :) – I4V

+0

죄송합니다, 그냥 눈치 채 셨습니다 :) 감사합니다! – Demarsch