2014-07-08 54 views
9

XmlSerializer不會序列化只讀字段,只讀屬性(僅與getter),私有字段等。另外,如果類沒有無參數構造函數,它將不會序列化對象。我的問題,爲什麼我不能用XmlSerializer序列化只讀字段?

1)AFAIK出現這些問題是因爲私有(和只讀)字段無法訪問(和更改),而deserilization。但是如果我不進行反序列化呢?難道我沒有這個選擇嗎?

2)由於相同的原因(反序列化問題),如果類沒有無參數構造函數,它不會序列化對象。但是,當我添加一個私人無參數構造函數,它工作正常。怎麼樣?

3)我不喜歡爲每個類添加一個無參數構造函數,並且爲了能夠序列化它而使所有的字段成爲公共的而非只讀的。現在我在私有無參數構造函數中拋出異常以防止使用。是否有構造函數的屬性告訴編譯器只有授權的調用才能被構造函數使用?如果不是,至少我想用一個拋出異常的屬性標記它,如果它被調用。

+0

1,2)我認爲原因是稍後序列化的點是反序列化。這就像你想把東西放在你的旅行箱裏,儘管你知道機場安全不會讓你回到你身邊。 3)你認爲'授權'電話是什麼意思?來自課堂本身的電話? –

+0

@KamilT通過「授權呼叫」我的意思是,例如,只允許來自特定方法的呼叫(或根本不允許)。對於這個問題'Obsolote'解決了我的問題。 – serdar

回答

5

這是相當一個很好的問題,我會盡我所能回答:

1)相信對於二傳手以及吸氣的原因是,它通常假設,如果你只得到了一getter然後它暗示它不是一個實例屬性,它是派生的東西。這意味着如果你要反序列化它(我知道你沒有這樣做),那麼你可以通過設置所有其他字段來獲得這個值,因此序列化不需要關心它。

2)無參數構造函數是必需的原因是因爲類型將使用反射創建。可能通過像Activator.CreateInstace(type)這樣的電話。這需要一個無參數的構造函數來創建實例,但它可能無關緊要,如果它是公共的或私有的。

實例需要的原因是它的字段可以用從XML檢索到的數據填充。

3)您需要這個構造函數,但是您可以添加ObsoleteAttribute以確保它不是手動調用,或者像您在做的那樣做並使其變爲私有。周圍的一些問題的工作

[Obsolete(true)] 
public Foo() 
{ 

} 

一種方式可以是手動實現IXmlSerializable接口,那麼你就有了序列化更精細的控制,但將仍然需要參數的構造函數。

+0

關於nr'3' - 不會'過時(true)'阻止對該函數的所有調用?即使是「授權」(仍在等待OP的定義)方式? –

+1

@KamilT:如果他只是在序列化之前添加它,它應該可以正常工作,因爲它會產生編譯錯誤而不是運行時錯誤。由於代碼中不會直接調用,所以在構建時不應該是一個問題。 – Ian

+0

感謝您的解釋,+1爲你 –

相關問題