2010-07-01 3 views
0

저는 lo-REST API를 구현 중이며 XML 또는 JSON을 반환하려고합니다. .NET WCF로 빌드하십시오.WCF는 REST에 대해 가변 복합 유형을 랩합니다.

<lfm status="ok"> 
    <user> 
    <name>RJ</name> 
    <realname>Richard Jones </realname> 
    <country>UK</country> 
    <age>27</age> 
    </user> 
</lfm> 

또는

<lfm status="ok"> 
    <track> 
    <name>Best track ever</name> 
    <album>Thriller</album> 
    </user> 
</lfm> 

또는

<lfm status="fail"> 
    ... error details 
</lfm> 

:

나는 플리커 (Flickr)와 알라 간단한 응답 랩 자신의 변수 복잡한 유형을 마지막 FM API를 모두의 디자인을 좋아한다 복잡한 유형의 직렬화는 예상대로 간단합니다 (DataContract, DataMember 등 사용). 그러나 일종의 커스텀 응답으로 그것을 감싸는 것은 내부에 포함될 수있는 변수 유형이 복잡하기 때문에 저를 감추고 있습니다. 응답을 복합 유형으로 채워진 유형 객체의 구성원에게 제공하면 직렬화되지 않습니다.

[DataContract] 
public class Response 
{ 
    public enum ResponseStatus 
    { 
     ok, 
     fail 
    } 

    [DataMember] 
    public ResponseStatus Status { get; set; } 

    [DataMember] 
    public object Data { get; set; } 

} 

모든 아이디어 나 도움을 주시면 감사하겠습니다.

많은 감사, 알렉스

편집 : 그것은 멋지게에는 직렬화하지 않더라도 팀 로버츠는 흥미로운 솔루션을 제공합니다. 옵션은 모든 잠재적 복합 유형을 [DataMember (EmitDefaultValue = false)]가 지정된 속성으로 지정하여 null이 직렬화되지 않도록하는 것입니다. 이것이 최선의 해결책인지는 모르겠다.

답변

1

당신은 ResponseData 종류의 클래스 계층 구조를 정의 할 수 있습니다 :

예는,

[DataContract] 
public abstract class Data 
{ } 

[DataContract] 
public class FooData : Data 
{ } 

[DataContract] 
public class BarData : Data 
{ } 

다음하여 Response 클래스에 알려진 유형의 표시 : 사실

[DataContract] 
[KnownType(typeof(FooData))] 
[KnownType(typeof(BarData))] 
public class Response 
{ 
    public enum ResponseStatus 
    { 
     ok, 
     fail 
    } 

    [DataMember] 
    public ResponseStatus Status { get; set; } 

    [DataMember] 
    public Data Data { get; set; } 
} 
+0

를, 그것은 [KnownType] 특성을 Data 클래스에 넣는 것이 더 합리적입니다. –

+0

거의 다 왔어. 문제는 그것이 직렬화되는 방법입니다. 결국 대신에 와 같은 노드로 끝납니다. – Maleks