2009-07-24 1 views
4

현재 Dictionary에서 상속받은 클래스가 있으며 여기에 몇 가지 일등 클래스 멤버 속성이 추가됩니다. 대략 :사전에서 상속 한 클래스를 사용하는 JSON 직렬화 <T,V>

public class Foo : Dictionary<string, string> 
{ 
    public string Bar { get; set; } 
    public string Baz { get; set; } 
} 

그러나 JSON에이 개체의 인스턴스를 직렬화하면,이 시리얼 라이저는 내가 사전에 저장 한 키/값의 짝을 방출 것으로 보인다. 새로운 1st Class 속성에 DataMember 특성을 적용하더라도 JSON serializer는 이러한 작업을 수행하지 않아도되며 대신 무시됩니다.

근본적으로 초보적인 요소가 있다고 생각하지만, .net의 JSON 시리얼 라이저에 코드 샘플과 문서를 뒤져 보면, 내가하는 일과 일치하지 않는 사소한 예를 발견했을뿐입니다. 다른 기본 클래스에서 파생 된 다른 모든 클래스는이 문제를 나타내지 않습니다. 특히 일반 사전에서 파생되는이 클래스는 우리에게 적합합니다.

[편집] 사전을 Foo에 퍼스트 클래스 속성으로 옮기는 것보다 짧지 만, 어쨌든이 작업을 수행 할 수 있습니까? 전화 끊기는 serializer가 다른 멤버와 구별하기 위해 사전에 "이름을 붙일"것을 모르는 것이라고 가정하고 있습니까?

+0

가능한 복제본 [C#으로 사전을 JSON 문자열로 변환하려면 어떻게해야합니까?] (http://stackoverflow.com/questions/5597349/how-do-i-convert-a-dictionary-to-a- json-string-in-c) –

답변

3

아마도 조성 기반 솔루션은이 경우에 좋을 것이다 :

{"Bar":"bar","Baz":"baz","Items":[{"Key":"first","Value":"first"}]}

이이 해결 방법으로 문제를 해결할 것인가 :

using System; 
using System.Collections.Generic; 
using System.Runtime.Serialization.Json; 
using System.IO; 
using System.Text; 

class Program 
{ 
    static void Main() 
    { 
     Foo foo = new Foo { Bar = "bar", Baz = "baz" }; 
     foo.Items.Add("first", "first"); 

     DataContractJsonSerializer serializer 
      = new DataContractJsonSerializer(typeof(Foo)); 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, foo); 
      Console.WriteLine(Encoding.Default.GetString(ms.ToArray())); 
     } 
    } 
} 

public class Foo 
{ 
    public Dictionary<string, string> Items { get; set; } 
    public string Bar { get; set; } 
    public string Baz { get; set; } 

    public Foo() 
    { 
     this.Items = new Dictionary<string, string>(); 
    } 
} 

이 출력을 생성?

+0

앤드류 당신이 펀치에 나를 때려 눕히고, 나는 당신이 올린 글을 원래대로 편집하고 있었다. 나는 레거시 작품 인 것처럼 푸 (Foo) 클래스를 바꿀 필요가 없기를 바라고있다. 그러나 전선을 가로 질러이 일을 직렬화 할 수 없다면, 제 손이 강요 당할 수도 있습니다. – bakasan

+0

@bakasan Foo 자체를 변경하는 대신 Andrew의 예와 같이 직렬화하기 쉬운 Data Transfer Object를 만들고 Foo의 데이터로 초기화 할 수 있습니까? –

+0

@Gabe ooh, 그건 훌륭한 아이디어입니다. 사실 직렬 변환에 들어가기 전에 변환을 바로 인라인하는 빠르고 더러운 확장 메서드를 만들 수 있습니다 ... 수천 개의 장소를 건드리지 않고 모두 Foo가 사용됩니다. 고마워요! (그리고 확장 방법에 대한 하나님 감사) – bakasan

관련 문제