有没有办法让DataContractSerializer能够很好地使用不可变对象?
在很多情况下,公共设置器根本不合适,但我仍然需要一种方法来序列化它们。目前我正在手写XML,可以传递给构造函数,但这非常容易出错并且很容易。
答案 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
}
}
}