2014-07-04 17 views
0

POCO是否可以包含構造函數?你能告訴我,這堂課是否正確?我還讀到一個POCO必須有一個無參數的構造函數。這是正確的,爲什麼?如果我接受這個無參數的構造函數,那麼我的只讀Id屬性會有問題。對我來說,如果這個屬性必須是隻讀的,那麼初始化它的唯一方法就是在構造函數中。POCO是否可以包含構造函數?

[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; } 
} 
+0

將其編譯?是。我們知道你的需求是否正確?當然不是。就目前來看,這不是一個好問題。 –

+0

如果您在實體框架代碼優先的情況下指的是POCO,那麼不會,實體框架將不會支持您的類。你需要一個無參數的構造函數。 –

+1

也不會WCF,它基於您的目標'[DataContract]'屬性。 –

回答

2

甲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; } 
} 
+0

糾正我,但我仍然可以寫我自己的反序列化過程。 –

+0

@ B413是的,你可以做到這一點,但你爲什麼?在.Net中有很多序列化機制,不需要重新發明輪子。 –

+1

我喜歡這個「沒有必要重新發明輪子」。相信我總有一個重新發明車輪的理由。最好的例子可能是.NET框架。我認爲這句話應該從IT ......和大多數其他工程工作中放逐。 –

相關問題