【问题标题】:Serialize T that contains List<T>序列化包含 List<T> 的 T
【发布时间】:2012-08-23 06:19:06
【问题描述】:

我想序列化一个MyClass,这是一个包含MyClass列表的类。

在XML中,我只想写myClass.Name,然后当我反序列化它时,我会找到哪个MyClass应该在哪个MyClass中。我有以下代码可以将MyClass 的列表正确序列化为string 的列表。但是,它不会反序列化字符串列表。

//List of actual object. It's what I use when I work with the object.
[XmlIgnore]
public List<TaskConfiguration> ChildTasks { get; set; }

//Used by the serializer to get the string list, and used
//by the serializer to deserialize the string list to.
[XmlArray("ChildTasks")]
public List<string> ChildTasksSurrogate
{
    get
    {
        List<string> childTaskList = new List<string>();

        if (ChildTasks != null)
            childTaskList.AddRange(ChildTasks.Select(ct => ct.Name).ToList());

        if (_childTasksSurrogate != null)
            childTaskList.AddRange(_childTasksSurrogate);

        //Clears it not to use it when it serializes.
        _childTasksSurrogate = null;
        return childTaskList;
    }
    set
    {
        _childTasksSurrogate = value;
    }
}

[XmlIgnore]
private List<string> _childTasksSurrogate;

正如我所说,序列化有效。问题在于反序列化。反序列化后,MyClass._childTasksSurrogatenull

【问题讨论】:

  • 在返回语句之前的 get 访问器中,您已将 null 分配给 childTasksSurrogate 的明确代码。
  • 在哪里?我不会将我返回的值归零。但是,我认为它可以让我找到问题所在:我理所当然地认为反序列化不会调用 getter,而只会调用 setter。我将使用 getter 并添加一个标志,表明 List 是否已转换为 List。谢谢!
  • 谁说您将返回的值归零。您已在 get 访问器中将 null 分配给 _childTasksSurrogate

标签: c# serialization xml-serialization deserialization xml-deserialization


【解决方案1】:

问题与XmlSerializer 如何反序列化 Xml 有关: 我认为XmlSerializer 将分配整个属性(阅读:myList = DeserializedList),而看起来它添加了所有元素(阅读:myList.AddRange(DeserializedList)

【讨论】:

  • 这并没有真正说明您是如何解决问题的。考虑添加一个代码 sn-p 来说明您的解决方案。
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2012-06-14
  • 2011-01-24
  • 2016-07-06
  • 1970-01-01
相关资源
最近更新 更多