Microsoft XmlSerializer中似乎存在一個錯誤/不一致:如果您有一個標記爲System.ComponentModel.DefaultValue
屬性的屬性,則該屬性不會被序列化。公平 - 這可以被看作是一種預期的行爲。如何使XmlSerializer.Deserialize正確處理DefaultAttribute?
問題是反序列化時不尊重相同的屬性。下面的代碼說明了這個問題。
問題是我怎麼能繞過這個?我有潛在的數百個業務類,在UI層(視圖)中使用默認值,因此構造函數中的默認值初始化不是一個選項。它必須是通用的。我可以創建一個全新的默認屬性,但它看起來像重複的工作。您是否看到了重寫XmlSerializer行爲的方法,還是應該只使用另一個可以更好地完成這項工作的序列化程序?
的示例代碼:
public class DefaultValueTestClass
{
[System.ComponentModel.DefaultValue(10000)]
public int Foo { get; set; }
}
[TestMethod]
public void SimpleDefaultValueTest()
{
// Create object and set the property value TO THE DEFAULT
var before = new DefaultValueTestClass();
before.Foo = 10000;
// Serialize => xml
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(DefaultValueTestClass));
string xml;
using (var stream = new System.IO.StringWriter())
{
serializer.Serialize(stream, before);
xml = stream.ToString();
}
// Deserialize the same object
DefaultValueTestClass after;
using (var reader = new System.IO.StringReader(xml))
{
after = (DefaultValueTestClass)serializer.Deserialize(reader);
}
// before.Foo = 10000
// after.Foo = 0
Assert.AreEqual(before.Foo, after.Foo);
}
我想你可以通過反射,在反序列化,使用DefaultValue屬性獲取類和它的超類的所有屬性,爲每個屬性獲取值,將其轉換爲正確的類型,並且仍然通過反射,在反序列化的對象上調用屬性的setter方法,抓取值作爲參數 – jbl
@jbl是的,這是我在UI層做的。但是我不能在XmlSerializer.Deserialize之後執行它,因爲我不知道Foo = 0是因爲它沒有被序列化,還是因爲它被用戶設置爲0.這樣,我需要在反序列化之前插入串行器發生。並不知道如何(除了在構造函數中,因爲大量的類,我不想這樣做)。 – Ope
也許這可以用一些動態代理完成,這些動態代理將實現IXmlSerializable接口來代替你的類。我必須承認它只是隨機的想法,雖然...... – jbl