提问者:小点点

在unity中反序列化XML数组


我正在尝试反序列化XML文档中的对象数组。在以下结构中构建的文档:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <element>
      .....
   </element>
  <element>
      .....
   </element>
</root>

但由于某些原因,我有很多问题这样做。这是我的函数,我调用它来反序列化它:

public static CardModel[] Load(string text)
        {
            XmlRootAttribute xRoot = new XmlRootAttribute();
            xRoot.ElementName = "root";
            xRoot.IsNullable = true;
            
            XmlSerializer serializer = new XmlSerializer(typeof(CardModel[]),xRoot);
            StringReader reader = new StringReader(text);
            CardModel[] o = serializer.Deserialize(reader) as CardModel[];
            reader.Close();
            
            return o;
        }

我不确定它做得是否正确。因为我知道在json中无法反序列化数组,必须进行某种“hack”。

在CardModel类(它是数组的元素)中,我在类的上方使用标记[xmlroot(“root”)]。我也尝试过使用[XMLRoot(“Element”)],但仍然卡住了。


共1个答案

匿名用户

Afaik不能直接反序列化为数组,但需要一个包装类,如

[Serializable]
[XMLRoot("root")]
public class Root
{
    // This does the magic of treating all "element" items nested under the root
    // As part of this array
    [XmlArray("element")]
    public CardModel[] models;
}

而是反序列化成类似的

public static CardModel[] Load(string text)
{  
    // I don't think that you need the attribute overwrite here
   
    var serializer = new XmlSerializer(typeof(Root));
    using(var reader = new StringReader(text))
    {
        var root = (Root) serializer.Deserialize(reader);
        return root.models;
    }
}