POCO可以包含构造函数吗?
本文关键字:构造函数 包含 POCO | 更新日期: 2023-09-27 18:11:28
POCO可以包含构造函数吗?你能告诉我这个课程是否正确吗?我还读到POCO必须有一个无参数构造函数。这是正确的吗?为什么?如果我接受这个无参数构造函数,我的只读Id
属性就会出现问题。在我看来,如果这个属性必须是只读的,那么初始化它的唯一方法就是在构造函数中。
[DataContract]
public class MembershipUser
{
public MembershipUser(Guid idValue)
{
this.Id = idValue;
}
[DataMember]
public virtual readonly Guid Id { get; set; }
[DataMember]
public virtual string UserName { get; set; }
[DataMember]
public virtual string Email { get; set; }
}
POCO对象可以包含其他构造函数,但反序列化需要默认构造函数,因为该过程试图创建对象的默认实例,然后设置属性。
经过一番研究,似乎数据契约序列化器不使用甚至不调用默认构造函数。使用这个方法,您可以排除默认的actor,并且仍然序列化您的POCO。你是否应该这样做是你和你的团队必须决定的实现细节。
DataContractSerializer测试:
[Test]
public void SerializerTest()
{
var s = new SerializeMe(2);
s.Name = "Test";
DataContractSerializer dcs = new DataContractSerializer(typeof(SerializeMe));
Stream ms = new MemoryStream();
var writer = XmlWriter.Create(ms);
Assert.DoesNotThrow(() => dcs.WriteObject(writer, s));
writer.Close();
ms.Position = 0;
var reader = new StreamReader(ms);
var xml = reader.ReadToEnd();
Console.WriteLine(xml);
}
[Test]
public void DeserializeTest()
{
var xml = "<?xml version='"1.0'" encoding='"utf-8'"?><SerializeMe xmlns:i='"http://www.w3.org/2001/XMLSchema-instance'" xmlns='"http://schemas.datacontract.org/2004/07/Test'"><Id>2</Id><Name>Test</Name></SerializeMe>";
DataContractSerializer dcs = new DataContractSerializer(typeof(SerializeMe));
XmlReader reader = XmlReader.Create(new StringReader(xml));
var obj = dcs.ReadObject(reader) as SerializeMe;
Assert.AreEqual(obj.Name, "Test");
}
[DataContract]
public class SerializeMe
{
public SerializeMe(int id)
{
this.Id = id;
}
[DataMember]
public int Id { get; private set; }
[DataMember]
public string Name { get; set; }
}