2009-04-26 2 views
4

Silverlight 응용 프로그램에서 사용하는 WCF 응용 프로그램을 작성하는 중입니다. 대부분의 설계 작업을 완료했으며 현재 구현을 수행하고 있는데,이 문제로 인해이 질문이 떠오르게되었습니다.요청 당 동일한 개체를 두 번 이상 serialize하는 DataContractSerializer

[DataContract] 
class Person 
{ 
    [DataMember] 
    private Towel mostRecentlyUsedTowel; 

    [DataMember] 
    private Gym gym; //the gym that this person attends 

    ... 
} 
다음

[DataContract] 
class Gym 
{ 
    [DataMember] 
    private List<Towel> towels; //all the towels this gym owns 

    ... 
} 

나가에 얻고있는 작업은 다음과 같습니다 : 여기

내 응용 프로그램에 존재하는 무언가의 예 내 응용 프로그램에서 mostRecentlyUsedTowel이 사람의 체육관 수건 목록에서 뭔가 가리키는 것 . 일부 요청은 Person 객체를 직렬화합니다.

DataContractSerializer는 똑같은 개체 인스턴스를 두 번 serialize하도록 요청하는 것을 알기에 충분히 똑똑합니까? 그렇다면 어떻게 처리할까요?

동일한 인스턴스를 두 번 serialize하는 경우이 링크를 통해 불필요한 데이터를 보내지 않으려면 어떻게해야합니까?

답변

7

다음 코드 :

[DataContract(IsReference=true)] 
public class Towel 
{ 
    // you have to specify a [DataMember] in this because you are 
    // explicitly adding DataContract 
    [DataMember] 
    public int Id { get; set; } 
} 

:이 같은 수건 클래스의를 DataContract 특성에 IsReference 속성을 추가 한 경우

<?xml version="1.0" encoding="utf-16"?> 
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org"> 
    <gym> 
    <towels> 
     <Towel><Id>1</Id></Towel> 
     <Towel><Id>2</Id></Towel> 
     <Towel><Id>3</Id></Towel> 
    </towels> 
    </gym> 
    <recentlyUsedTowel><Id>1</Id></recentlyUsedTowel> 
</Person> 

:

[TestMethod] 
public void CanSerializePerson() 
{ 
    var towel1 = new Towel() { Id = 1 }; 
    var towel2 = new Towel() { Id = 2 }; 
    var towel3 = new Towel() { Id = 3 }; 
    var gym = new Gym(); 
    gym.towels.Add(towel1); 
    gym.towels.Add(towel2); 
    gym.towels.Add(towel3); 

    var person = new Person() 
    { 
     recentlyUsedTowel = towel1, 
     gym = gym 
    }; 

    var sb = new StringBuilder(); 
    using (var writer = XmlWriter.Create(sb)) 
    { 
     var ser = new DataContractSerializer(typeof (Person)); 
     ser.WriteObject(writer, person); 
    } 

    throw new Exception(sb.ToString()); 
} 

public class Person 
{ 
    public Towel recentlyUsedTowel { get; set; } 
    public Gym gym { get; set; } 
} 

public class Gym 
{ 
    public Gym() 
    { 
     towels = new List<Towel>(); 
    } 

    public List<Towel> towels { get; set; } 
} 


public class Towel 
{ 
    public int Id { get; set; } 
} 

가 평가합니다 다음과 같은 결과가 나옵니다.

<?xml version="1.0" encoding="utf-16"?> 
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org"> 
    <gym> 
    <towels> 
     <Towel z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
     <Id>1</Id> 
     </Towel> 
     <Towel z:Id="i2" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
     <Id>2</Id> 
     </Towel> 
     <Towel z:Id="i3" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
     <Id>3</Id> 
     </Towel> 
    </towels> 
    </gym> 
    <recentlyUsedTowel z:Ref="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" /> 
</Person> 

희망이 도움이됩니다.

+0

정확히 내가 찾고있는 것이 었습니다. 고맙습니다. – Craig

관련 문제