2012-08-05 3 views
0

MVC 4 웹 API로 작업 중이며 직렬화 문제가 발생했습니다. 답변을 찾을 수 없습니다. 코드에에 ...개체 목록을 직렬화 할 때 전체 개체 대신 출력 ID가

의 나는 다음과 같은 클래스가 있다고 가정 해 봅시다 :

public class Item { 
    public int ID; 
    public String Name; 
    public bool Active; 
} 

public class Source { 
    public int ID; 
    public int Name; 
} 

같은 모양 항목의 직렬화 된 목록 : 항목이 많이있는 경우

{ 
    ID: 1, 
    Name: "That big thing", 
    Active: true, 
    Source: { 
     ID: 1, 
     Name: "The street" 
    } 
} 

을 내 목록에서 각 소스를 객체로 직렬화하면 비효율적입니다. 내가하고 싶은 일은 목록에있을 때만 소스 ID를 얻는 것입니다. 뭔가 같이 :

{ 
    ID: 1, 
    Name: "That big thing", 
    Active: true, 
    Source: 1 
} 

답변

0

내가 Item 클래스는 또한 소스 속성을 포함, 항목의 당신의 직렬화 된 목록을 기반으로, 있으리라 믿고있어, 뭔가 같은 :

public class Item { 
    public int ID; 
    public String Name; 
    public bool Active; 
    public Source Source; 
} 

그런 경우, 당신은 추가 XmlIgnore 다음 새 SourceID 속성으로 소스의 ID를 노출, 소스 속성에 속성 수 :

public class Item 
    { 
     public int ID; 
     public String Name; 
     public bool Active; 
     [XmlIgnore] 
     public Source Source; 
     [XmlElement("Source")] 
     public int SourceID 
     { 
      get 
      { 
       if (Source != null) 
       { 
        return Source.ID; 
       } 
       else 
       { 
        return 0; 
       } 
      } 
      set 
      { 
       // ignore incoming values 
      } 
     } 
    } 

XML을 준수하지 않는 JSON 라이브러리 속성 가능성이있을 수 있습니다; 이 경우 해당 속성 (예 : JsonIgnore, JsonProperty)을 사용할 수 있습니다.

0

여기에 게시 된 [JsonIgnore] 제안은 좋은 것이지만 JSON.NET 직렬화에서만 작동합니다.

는 일반적인 방법으로이 작업을 수행 들은 System.Runtime.Serialization에 DLL을 참조를 추가하고 그에 따라 모델을 장식하기 :

[DataContract] 
public class Source 
{ 
    [DataMember] 
    public int ID; 

    public int Name; 
} 

이 당신이 웹에서 사용하는 MediaTypeFormatting에서 Name 속성을 생략 할 것이다 API의 예

<Active>true</Active> 
<ID>1</ID> 
<Name>test</Name> 
<Source> 
<ID>1</ID> 
</Source> 

또는

"ID":1, 
"Name":"test", 
"Active":true, 
"Source":{"ID":1}