静态XML应对C#中的通用列表中的静态化



因此,我有一个XML文件,我试图将其供应到通用列表中,但是无论我做什么,列表都空无一人。我去了第一个〜10个堆栈溢出问题,但我还没有弄清楚。

当程序启动时,我致电FishContainer.load(),文件读取器读取文件恰到好处,但列表中没有任何内容。

XML文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FishContainer>
    <Fishies>
        <Fish Name = "test">
            <WaterType>salt</WaterType>
            <Price>1</Price>
            <Size>1</Size>
            <Aggression>1</Aggression>
        </Fish>
        <Fish Name = "test2">
            <WaterType>fresh</WaterType>
            <Price>12</Price>
            <Size>12</Size>
            <Aggression>12</Aggression>
        </Fish>
    </Fishies>
</FishContainer>

鱼容器

using UnityEngine;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;
public static class FishContainer {
[XmlArray("Fishies"), XmlArrayItem("Fish")]
public static List<FishData> fishs = new List<FishData>();
public static void Load() {
    TextAsset _xml = Resources.Load<TextAsset>("fishdata");
    XmlSerializer serializer = new XmlSerializer(typeof(List<FishData>), new XmlRootAttribute("FishContainer"));
    StringReader reader = new StringReader(_xml.text);
    fishs = (List<FishData>)serializer.Deserialize(reader);
    reader.Close();
    Debug.Log(fishs.Count);
}
public static FishData GetFishAttributeByName(string name) {
    foreach(FishData f in fishs) {
        if(f.Name.Equals(name))
            return f;
    }
    return null; //throw
}
}

鱼数据

using System.Xml;
using System.Xml.Serialization;
public class FishData {
[XmlAttribute("Name")] public string Name;
[XmlElement("WaterType")] public string WaterType;
[XmlElement("Price")] public int Price;
[XmlElement("Size")] public int Size;
[XmlElement("Aggression")] public int Aggression;
public override string ToString() {
    return Name + " " + WaterType + " " + Price + " " + Size + " " + Aggression;
}
}

问题是您应该考虑使用List<FishData>类型,但这不是您的XML文件在最高级别所包含的,而是FishContainer,这又有其中的 List<FishData>属性。

另外,您无法对静态属性或班级进行审理,因此至少需要删除FishContainer中的静态修饰符和属性。这是我要纠正 FishContainer的方式:

public class FishContainer
{
    [XmlArray("Fishies"), XmlArrayItem("Fish")]
    public List<FishData> Fishes { get; set; }
    public static FishContainer Load(string xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(FishContainer), new XmlRootAttribute("FishContainer"));
        using (StringReader reader = new StringReader(xml))
            return (FishContainer)serializer.Deserialize(reader);
    }
    public FishData GetFishAttributeByName(string name)
    {
        return Fishes
                .SingleOrDefault(fish => fish.Name.Equals(name));
    }
}

通常,我个人只尝试使用static方法或属性,如果它们不更改或保持某物的状态。您可以按以下方式称为;

var fishContainer = FishContainer.Load(_xml);
Console.WriteLine("I have {0} fishes", fishContainer.Fishes.Count);

编辑:但是,由于您希望它在FishContainer的单个实例上可以静态可用,因此您可以做类似的事情:

public class FishContainer
{
    private static FishContainer _instance;
    [XmlArray("Fishies"), XmlArrayItem("Fish")]
    public List<FishData> Fishes { get; set; }
    public static void Load(string xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(FishContainer), new XmlRootAttribute("FishContainer"));
        using (StringReader reader = new StringReader(xml))
            _instance = (FishContainer)serializer.Deserialize(reader);
    }
    public static FishData GetFishAttributeByName(string name)
    {
        if (_instance == null)
            throw new InvalidOperationException("FishContainer has not been loaded");
        return 
            _instance
            .Fishes
            .SingleOrDefault(fish => fish.Name.Equals(name));
    }
}

..并这样打电话:

FishContainer.Load(_xml);
var someFish = FishContainer.GetFishAttributeByName("test");

最新更新