【问题标题】:Property of a List<T> Not DeserializedList<T> 的属性未反序列化
【发布时间】:2015-01-26 23:49:37
【问题描述】:

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 只是一个类。如何让它填充FilePattern 属性?

【问题讨论】:

    标签: .net xml-serialization


    【解决方案1】:

    当涉及到 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; }
    }
    

    【讨论】:

      【解决方案2】:

      有时候你只想做你想做的事;框架该死。

      这是在我的情况下对我有用的例程的初稿。随着时间的推移,我会更新我的答案。

      我在我的 Serialization 助手模块中找到了这个,与我的其他“普通”类的 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        • 2012-09-09
        • 2011-09-09
        • 1970-01-01
        • 2014-10-08
        相关资源
        最近更新 更多