属性 列表<T> 未反序列化
Property of a List<T> Not Deserialized
属性 FilePattern
不会从 xml:
反序列化
<Parser FilePattern='*'/>
[Serializable(), XmlRoot("Parser")]
public class Parser : List<System.DateTime>
{
private string _FilePattern;
[XmlAttribute()]
public string FilePattern {
get { return _FilePattern; }
set { _FilePattern = value; }
}
}
private void ParserTest()
{
Parser Parser = Serialization.Deserialize("<Parser FilePattern='*'/>", typeof(Parser));
// Here, Parser.FilePattern is null
}
Parser
只是一个 class。我怎样才能让它填充 FilePattern
属性?
当涉及到 IEnumerable 类型时,XmlSerializer 有特殊的行为,因此您可能会看到与它的某种冲突。你可以考虑做类似下面的事情来模仿你想要的行为,而不是真正让你的类型成为一个列表:
[XmlRoot("Parser")]
public class Parser
{
public Parser()
{
this.Values = new List<DateTime>();
}
[XmlAttribute]
public string Attrib { get; set; }
[XmlElement("dateTime")]
public List<DateTime> Values { get; private set; }
}
有时候你只想做你想做的事;该死的框架。
这是在我的情况下对我有用的例程的初稿。随着时间的推移,我会更新我的答案。
我已经在我的 Serialization
帮助程序模块中找到了它以及 "normal" 类.
的其他 Deserialize
方法
基本上,它所做的是正常的反序列化,让 xml 反序列化器完成所有繁重的工作,然后用 xml 元素的属性填充新反序列化的对象。
就像我说的那样,这是一个草稿,但 Marc Gravell 说这是很多工作,所以我不得不这样做(让你的工作不那么多)!
/// <summary>
/// Overcome limitation of xml serializer
/// that it can't deserialize properties of classes
/// that inherit from IEnumerable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Xml"></param>
/// <returns></returns>
/// <remarks></remarks>
public T Deserialize<T>(string Xml) where T : IEnumerable
{
T functionReturnValue = default(T);
//let the xml serializer do the rest of the work
functionReturnValue = Deserialize(Xml, typeof(T));
//copy over the additional properties
using (XmlReader XmlReader = XmlTextReader.Create(new StringReader(Xml), new XmlReaderSettings {ValidationType = ValidationType.None,XmlResolver = null})) {
XmlReader.MoveToContent();
for (int Index = 0; Index <= XmlReader.AttributeCount - 1; Index++) {
XmlReader.MoveToAttribute(Index);
typeof(T).GetProperty(XmlReader.LocalName).SetValue(Deserialize(), XmlReader.Value, null);
}
}
return functionReturnValue;
}
public object Deserialize(string Xml, Type Type)
{
object functionReturnValue = null;
functionReturnValue = null;
if (Xml == string.Empty) {
return null;
}
_Serializer = new XmlSerializer(Type);
StringReader StringReader = new StringReader(Xml);
functionReturnValue = Serializer.Deserialize(StringReader);
if (functionReturnValue is IDeserializationEvents) {
((IDeserializationEvents)functionReturnValue).DeserializationComplete();
}
return functionReturnValue;
}
属性 FilePattern
不会从 xml:
<Parser FilePattern='*'/>
[Serializable(), XmlRoot("Parser")]
public class Parser : List<System.DateTime>
{
private string _FilePattern;
[XmlAttribute()]
public string FilePattern {
get { return _FilePattern; }
set { _FilePattern = value; }
}
}
private void ParserTest()
{
Parser Parser = Serialization.Deserialize("<Parser FilePattern='*'/>", typeof(Parser));
// Here, Parser.FilePattern is null
}
Parser
只是一个 class。我怎样才能让它填充 FilePattern
属性?
当涉及到 IEnumerable 类型时,XmlSerializer 有特殊的行为,因此您可能会看到与它的某种冲突。你可以考虑做类似下面的事情来模仿你想要的行为,而不是真正让你的类型成为一个列表:
[XmlRoot("Parser")]
public class Parser
{
public Parser()
{
this.Values = new List<DateTime>();
}
[XmlAttribute]
public string Attrib { get; set; }
[XmlElement("dateTime")]
public List<DateTime> Values { get; private set; }
}
有时候你只想做你想做的事;该死的框架。
这是在我的情况下对我有用的例程的初稿。随着时间的推移,我会更新我的答案。
我已经在我的 Serialization
帮助程序模块中找到了它以及 "normal" 类.
Deserialize
方法
基本上,它所做的是正常的反序列化,让 xml 反序列化器完成所有繁重的工作,然后用 xml 元素的属性填充新反序列化的对象。
就像我说的那样,这是一个草稿,但 Marc Gravell 说这是很多工作,所以我不得不这样做(让你的工作不那么多)!
/// <summary>
/// Overcome limitation of xml serializer
/// that it can't deserialize properties of classes
/// that inherit from IEnumerable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Xml"></param>
/// <returns></returns>
/// <remarks></remarks>
public T Deserialize<T>(string Xml) where T : IEnumerable
{
T functionReturnValue = default(T);
//let the xml serializer do the rest of the work
functionReturnValue = Deserialize(Xml, typeof(T));
//copy over the additional properties
using (XmlReader XmlReader = XmlTextReader.Create(new StringReader(Xml), new XmlReaderSettings {ValidationType = ValidationType.None,XmlResolver = null})) {
XmlReader.MoveToContent();
for (int Index = 0; Index <= XmlReader.AttributeCount - 1; Index++) {
XmlReader.MoveToAttribute(Index);
typeof(T).GetProperty(XmlReader.LocalName).SetValue(Deserialize(), XmlReader.Value, null);
}
}
return functionReturnValue;
}
public object Deserialize(string Xml, Type Type)
{
object functionReturnValue = null;
functionReturnValue = null;
if (Xml == string.Empty) {
return null;
}
_Serializer = new XmlSerializer(Type);
StringReader StringReader = new StringReader(Xml);
functionReturnValue = Serializer.Deserialize(StringReader);
if (functionReturnValue is IDeserializationEvents) {
((IDeserializationEvents)functionReturnValue).DeserializationComplete();
}
return functionReturnValue;
}