在反序列化期间使用Xml参数构造对象

时间:2016-04-19 00:35:41

标签: c# xml deserialization

我刚刚开始使用C#并了解了.NET框架的优秀XmlSerializer。

我已经注释了这样一个类:

    [XmlRoot("time_entry")]
    public class TimeEntry
    {
        [XmlElement("id")]
        public int Id { get; set; }

        [XmlElement("project"), XmlAttribute("id")]
        public int ProjectId { get; set; }

        [....]
    } 

我已经可以使用以下方法进行基本的反序列化:

XmlSerializer s = new XmlSerializer(T);
s.Deserialize(response.GetResponseStream());

其中T是泛型类型。我现在的目标是更进一步,并给出这个XML:

<time_entries type="array" limit="25" offset="0" total_count="254">
    <time_entry>
        <id>299</id>
        <project id="152" name="Test"/>
        <issue id="1314"/>
        <user id="2" name="Anonymous"/>
        <activity id="9" name="Development"/>
        <hours>10.0</hours>
        <comments/>
        <spent_on>2015-11-09</spent_on>
        <created_on>2015-11-10T17:31:57Z</created_on>
        <updated_on>2015-11-10T17:31:57Z</updated_on>
    </time_entry>
</time_entries>

在现有字典中自动查找具有给定ID的项目,而不是在ProjectId类上设置TimeEntry属性,我将其替换为{{1}的实例我发现在Project XML元素上使用id属性。

这有可能吗?我想也许可以在getter中立即做一些事情,但是一旦字段的类型发生变化,似乎<project>元素就会被跳过

PS:我并不真正关心序列化过程,所以这些类不会被序列化回Xml ...

1 个答案:

答案 0 :(得分:0)

尝试在TimeEntry上实现IXmlSerializable以完全控制对象的反序列化方式。在反序列化期间,您可以分配Project的现有实例。