NET / Silverlight:不可变对象和DataContractSerializer

时间:2011-11-23 01:18:39

标签: .net silverlight

有没有办法让DataContractSerializer能够很好地使用不可变对象?

在很多情况下,公共设置器根本不合适,但我仍然需要一种方法来序列化它们。目前我正在手写XML,可以传递给构造函数,但这非常容易出错并且很容易。

2 个答案:

答案 0 :(得分:1)

数据协定序列化的本质是“序列化”的对象被视为黑盒子。序列化程序只能使用在对象表面上可见的序列化程序。事实上,不准确地说对象是序列化的,它是被序列化的数据契约。

一种方法是使内部设置者而非公开。然后,将InternalsVisibleToAttribute添加到指定System.Runtime.Serialization程序集的程序集中。使用此方法可以控制成员的可访问性。

答案 1 :(得分:0)

我们遇到了同样的问题,我们的解决方案是拥有两组类 - “数据契约”类和“API”类。每个数据协定类都将包含所有需要序列化的字段,而不包含任何其他字段(即没有任何方法或逻辑)。 API类将包装数据协定类,这是我们在API中公开的内容。

例如:

namespace MyApp.DataContracts 
{

  /// <summary>
  /// This class is part of the application infrastructure and is 
  /// not intended to be used from your code.
  /// </summary>
  /// <exclude />
  [DataContract]
  [EditorBrowsable(EditorBrowsableState.Never)]
  public class PersonData
  {
     [DataMember] public string firstName;
     [DataMember] public string lastName;
  }
}

namespace MyApp
{
  public class Person
  {
    private PersonData _data;

    public Person() 
      : this(new PersonData())
    {
    }

    internal Person(PersonData data) {
      this._data = data;
    }

    public FirstName {
      get { return this._data.firstName; }
      private set { this._data.firstName = value; }
    }

    public LastName {
      get { return this._data.lastName; }
      private set { this._data.lastName = value; }
    }

    public void Save() {
      // Code that serializes our PersonData and sends it to the server
    }

  }
}