甲POCO對象可以包含其他的構造,但需要一個默認的構造爲反序列化作爲該進程試圖創建對象的默認實例,然後設置屬性。
經過一番研究,似乎datacontract序列化程序不使用或者甚至調用默認構造函數。使用這個你可以排除一個默認的ctor,然後序列化你的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; }
}
將其編譯?是。我們知道你的需求是否正確?當然不是。就目前來看,這不是一個好問題。 –
如果您在實體框架代碼優先的情況下指的是POCO,那麼不會,實體框架將不會支持您的類。你需要一個無參數的構造函數。 –
也不會WCF,它基於您的目標'[DataContract]'屬性。 –