Wcf DataContractSerializer在每个请求中多次序列化同一对象

Wcf DataContractSerializer在每个请求中多次序列化同一对象,wcf,datacontractserializer,Wcf,Datacontractserializer,我正在编写一个将由Silverlight应用程序使用的WCF应用程序。我已经完成了大部分的设计工作,现在正在执行,这让我想到了这个问题 下面是我的应用程序中存在的一个示例: [DataContract] class Person { [DataMember] private Towel mostRecentlyUsedTowel; [DataMember] private Gym gym; //the gym that this person attends

我正在编写一个将由Silverlight应用程序使用的WCF应用程序。我已经完成了大部分的设计工作,现在正在执行,这让我想到了这个问题

下面是我的应用程序中存在的一个示例:

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

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

    ...
}

[数据合同]
班级体育馆
{
[数据成员]
私人毛巾清单;//这家健身房所有的毛巾
...
}
我的意思是:在我的应用程序中,大多数人都会用Towel指的是健身房毛巾清单上的东西。我的一些请求将序列化Person对象

DataContractSerializer是否足够聪明,以至于注意到它被要求对一个对象的完全相同的实例进行两次序列化?如果是,它是如何处理的

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

以下代码:

[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; }
}
您将得到如下输出:

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

1.
2.
3.

希望这有帮助。

这正是我想要的。多谢各位。
[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; }
}
<?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>