2009-04-26 22 views
4

我正在编写将由Silverlight应用程序使用的WCF应用程序。我已经完成了大部分设计工作,现在正在执行,这让我想到了这个问题。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是否足够智能以注意到它被要求两次序列化完全相同的对象实例?如果是这样,它是如何处理它的?

如果它只是将序列化相同的实例两次,我应该如何处理这个,所以我不通过链接发送不必要的数据?

回答

7

下面的代码:如果您添加的IsReference属性的毛巾类的这样的DataContract属性

<?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> 

[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; } 
} 

[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 2009-04-26 14:35:36

相关问题