2009-04-26 9 views
4

Silverlightアプリケーションで使用されるWCFアプリケーションを作成中です。私は設計作業の大部分を行っており、現在は実装を行っているので、この質問が出てきました。ここで要求ごとに同じオブジェクトを2回以上シリアル化する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は、オブジェクトのまったく同じインスタンスを2回シリアル化するよう要求されていることに気付くほどスマートですか?もしそうなら、それをどのように扱うのでしょうか?

同じインスタンスを2回シリアル化するだけの場合は、どうすればこの問題に対処すればいいですか?リンク上で不要なデータを送信しないでください。

答えて

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

関連する問題