2010-11-30 2 views
5

List <>에서 상속 받고 CollectionDataContract를 사용하는 매우 간단한 사용자 정의 컬렉션 유형이 있습니다.WCF와 DataContractSerializer는 CollectionDataContract로 장식 된 컬렉션 형식을 다르게 serialize합니까?

DataContractSerializer.WriteObject를 사용하여 직렬화 할 때 예상대로 CollectionDataContract 특성을 사용합니다. 그러나 WCF 메서드의 반환 형식으로 사용할 때 기본 ArrayOfFoo가 표시됩니다.

서비스 계약에 누락 된 장식이 있는지 궁금합니다.

세부 사항 : 난 그냥 푸를 인스턴스화 한 다음 직렬화 DataContractSerializer.WriteObject를 사용하는 경우

[DataContract(Namespace = "")] 
public class Foo 
{ 
    [DataMember] 
    public string BarString { get; set; } 
} 

[CollectionDataContract(Namespace = "")] 
[Serializable] 
public class FooList : List<Foo> {} 

, 난 당신이 기대하는 것을 얻을 :

<FooList> 
    <Foo> 
     <BarString>myString1</BarString> 
    </Foo> 
</FooList> 

그러나, 나는이있는 경우 이와 같은 방법으로 서비스하십시오 ...

[ServiceContract Name = "MyService"] 
public interface IMyService 
{ 
    [OperationContract, WebGet(UriTemplate = "foos/")] 
    FooList GetAllFoos(); 
} 

에 대해 GET을 수행하십시오.은,이 얻을 :

<ArrayOfFoo> 
    <Foo> 
     <BarString>myString1</BarString> 
    </Foo> 
</ArrayOfFoo> 

나는 또한 CollectionDataContract 속성에 이름 = "MyFooListName"를 지정 시도했습니다. 같은 결과 : DataContractSerializer는 메모를 가져옵니다. WCF는 그렇지 않습니다.

+0

저는 네가 목록을 배열로 변환한다고 생각합니다. –

+0

컬렉션 유형을 사용자 지정하지 않으면 목록이 배열로 직렬화됩니다. 알아 내려고하는 것은 WCF가 내 CollectionDataContract를 존중할 수있는 방법이 있는지 여부입니다. – pisomojado

답변

3

Saeed가 올바른 방향으로 나를 보냈습니다. DataContractSerializer를 원할 때 실수로 XmlSerializer가 발생했습니다.

나는 XmlSerializer로 끝났습니다 ... 음 ... 묻습니다. 이 같은 XmlSerializerFormat 내 서비스에 특히

, 내가 장식했다 방법 :

[ServiceContract Name = "MyService"] 
public interface IMyService 
{ 
    // ... other stuff ... 

    [OperationContract, WebInvoke(UriTemplate = "foos/", Method = "POST")] 
    [XmlSerializerFormat] 
    Foo PostAFoo(Foo yourNewFoo); 
} 

나는 손으로 압연 푸 XML의 모양에 멤버 순서를 용서의 희망에 이런 짓을했다.물론,이 작업을 수행 할 때 DataContractSerializer가 아니라 XmlSerializer가 필요합니다.

XmlSerializerFormat 특성을 제거하면 문제가 해결되었습니다. WCF는 이제 원하는 방식으로 내 FooList 컬렉션을 직렬화합니다.

+0

위의 코드를 테스트하지는 않았지만 컬렉션에 적합합니까? –

2

세부 사항에 대한 MSDN를 참조하십시오

DataContractSerializer는 XmlSerializer를하고 ASP.NET 웹 서비스에서 사용하지 지원 프로그래밍 모델을 수행합니다. 특히 XmlElementAttribute 및 XmlAttributeAttribute와 같은 특성을 지원하지 않습니다. 이 프로그래밍 모델에 대해 지원을 사용하려면 DataContractSerializer 대신 XmlSerializer를 사용하려면 WCF를 전환해야합니다.

그래서 직렬화는 XMLSerializer에 의해 수행되고 변경할 수 없습니다.

0

WCF 서비스를 구성하는 동안 일반 유형을 선택하셨습니까? 그렇지 않다면

마우스 오른쪽 버튼을 클릭하고 구성으로 가서 일반 유형을 선택하십시오. 기본값은 arraylist 유형입니다.