我從第三方獲得一個xml,我需要將它反序列化爲C#對象。這個XML可能包含整型或空值的屬性:attr =「11」或attr =「」。我想將此屬性值反序列化到具有可爲空的整數類型的屬性中。但XmlSerializer不支持反序列化爲可空類型。以下測試代碼在創建XmlSerializer時出現InvalidOperationException異常{「存在反映類型'TestConsoleApplication.SerializeMe'的錯誤。」}。使用XmlSerializer將空的xml屬性值反序列化爲可空屬性的int屬性
[XmlRoot("root")]
public class SerializeMe
{
[XmlElement("element")]
public Element Element { get; set; }
}
public class Element
{
[XmlAttribute("attr")]
public int? Value { get; set; }
}
class Program {
static void Main(string[] args) {
string xml = "<root><element attr=''>valE</element></root>";
var deserializer = new XmlSerializer(typeof(SerializeMe));
Stream xmlStream = new MemoryStream(Encoding.ASCII.GetBytes(xml));
var result = (SerializeMe)deserializer.Deserialize(xmlStream);
}
}
當我改變 '值' 屬性的類型爲int,反序列化失敗,出現InvalidOperationException:
有XML文檔(1,16)中的錯誤。
任何人都可以建議如何將空值的屬性反序列化爲可爲空的類型(作爲空),同時將非空屬性值反序列化爲整數?這有沒有什麼竅門,所以我不需要手動對每個域進行反序列化(實際上有很多)。從ahsteele評論後
更新:
-
據我所知,這個屬性僅適用於XmlElementAttribute - 這個屬性指定元素沒有內容,無論是子元素或身體文本。但我需要找到XmlAttributeAttribute的解決方案。無論如何,我不能改變XML,因爲我無法控制它。
-
此屬性只能當屬性值不爲空時或屬性缺失。當attr具有空值(attr =')時,XmlSerializer構造函數失敗(如預期的那樣)。
public class Element { [XmlAttribute("attr")] public int Value { get; set; } [XmlIgnore] public bool ValueSpecified; }
Custom Nullable class like in this blog post by Alex Scordellis
我試圖從這個博客帖子我的問題採取類:
[XmlAttribute("attr")] public NullableInt Value { get; set; }
但XmlSerializer的構造失敗,出現InvalidOperationException:
無法序列成員類型TestConsoleApplication.NullableInt的'Value'。
XmlAttribute/XMLTEXT不能用於編碼實現IXmlSerializable的類型}
醜陋的替代品溶液(可恥的是我,我在這裏寫了這個代碼:)):
public class Element { [XmlAttribute("attr")] public string SetValue { get; set; } public int? GetValue() { if (string.IsNullOrEmpty(SetValue) || SetValue.Trim().Length <= 0) return null; int result; if (int.TryParse(SetValue, out result)) return result; return null; } }
但我不我不想拿出這樣的解決方案,因爲它打破了我的班級爲其消費者的界面。我會更好地手動實現IXmlSerializable接口。
目前,它看起來像我要實現IXmlSerializable的整個元素類(這是很大的),並沒有簡單的解決方法......
「使用XmlSerializer的反序列化到一個可爲空值」的鏈接是死。 [這是Google的緩存版本](http://webcache.googleusercontent.com/search?q=cache:vT5GiyOCWyIJ:www.rqna.net/qna/zzrzt-deserialise-missing-xml-attribute-to-nullable-type .html) – Anttu 2014-06-13 08:09:48
@Anttu我將原始*的Wayback Machine存檔的答案切換爲鏈接,使用XmlSerializer將其反序列化爲Nullable *。 –
ahsteele
2014-06-16 21:34:46