首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未反序列化的List<T>的属性

未反序列化的List<T>的属性
EN

Stack Overflow用户
提问于 2015-01-24 20:42:53
回答 2查看 335关注 0票数 1

属性FilePattern不会从xml中反序列化:

代码语言:javascript
复制
<Parser FilePattern='*'/>
代码语言:javascript
复制
[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属性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-26 15:49:37

有时候你只想做你想做的事,框架被诅咒了。

这是在我这种情况下对我有用的例行公事的第一稿。随着时间的推移,我会更新我的答案。

我已经在我的Serialization助手模块中找到了它,以及“普通”类的其他Deserialize方法。

基本上,它所做的是一个正常的反序列化,让xml反序列化器完成所有的工作,然后用xml元素的属性填充新反序列化的对象。

就像我说的,这是一个草案,但说这是很多工作,所以我只需要做(使它不是很多工作为你!)

代码语言:javascript
复制
/// <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;
}
票数 1
EN

Stack Overflow用户

发布于 2015-01-26 00:50:29

当涉及到XmlSerializer类型时,IEnumerable具有特殊的行为,因此您可能会看到与之有某种冲突。您可以考虑执行以下类似于您想要的行为的操作,而不必实际将您的类型设置为列表:

代码语言:javascript
复制
[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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28130050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档