You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中使用XmlSerializer保存网格类时XML文件为空的问题

问题排查与修复方案

你的XML序列化仅生成头部内容,是因为代码存在几个关键问题,逐个修复即可正常生成完整XML:

1. 只读属性无法被XmlSerializer序列化

SerializableGrid中的TilesList和GridSize只有get访问器,XmlSerializer要求属性必须可读写(同时具备get和set),因为序列化过程需要创建实例后为属性赋值。修改代码如下:

public class SerializableGrid
{
    [XmlArray("TilesList"), XmlArrayItem("GridTile")]
    public GridTile[] TilesList { get; set; }  // 补充set访问器
    [XmlElement("GridSize")]  // 复杂类型不能用XmlAttribute,改为XmlElement
    public GridSize GridSize { get; set; }  // 补充set访问器

    public SerializableGrid(Dictionary<GridTile, GameObject> gridTilesDict, GridSize gridSize)
    {
        GridSize = gridSize;
        TilesList = new GridTile[gridTilesDict.Count];
        var i = 0;
        foreach (var p in gridTilesDict)
        {
            TilesList[i] = p.Key;
            i++;
        }
    }
    public SerializableGrid(){}
}

2. 抽象类无法被XmlSerializer序列化

GridSize是抽象类,XmlSerializer无法实例化抽象类型,需要将其改为普通类,并补充无参构造函数:

// 移除abstract关键字
public class GridSize
{
    public int R;
    public int C;
    public int H;

    public GridSize(int r, int c, int h)
    {
        R = r;
        C = c;
        H = h;
    }
    // 必须添加无参构造函数
    public GridSize(){}
}

3. 复杂类型不能用XmlAttribute标记

GridTile中的TileCoordinates和Vector3属于复杂类型,不能用XmlAttribute(仅支持基本数据类型),需改为XmlElement;同时TileCoordinates缺少无参构造函数,必须补充:

public class GridTile
{
    [XmlElement("TileCoordinates")]  // 替换XmlAttribute为XmlElement
    public TileCoordinates Coordinates;
    [XmlElement("WorldCoordinates")]  // 替换XmlAttribute为XmlElement
    public Vector3 WorldCoordinates;

    public GridTile(TileCoordinates coordinates, Vector3 worldCoordinates)
    {
        Coordinates = coordinates;
        WorldCoordinates = worldCoordinates;
    }

    public GridTile() { }
    
    public class TileCoordinates
    {
        public float x;
        public float y;
        public float z;

        public TileCoordinates (float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
        // 添加无参构造函数
        public TileCoordinates(){}
    }
}

4. Unity Vector3序列化补充说明

XmlSerializer默认可序列化Vector3(因其有公共x/y/z字段和无参构造),如果后续出现序列化异常,可以手动拆分序列化:

public class GridTile
{
    [XmlElement("TileCoordinates")]
    public TileCoordinates Coordinates;
    
    [XmlIgnore]
    public Vector3 WorldCoordinates;

    // 手动序列化Vector3的三个分量
    [XmlElement("WorldX")]
    public float WorldX { get { return WorldCoordinates.x; } set { WorldCoordinates.x = value; } }
    [XmlElement("WorldY")]
    public float WorldY { get { return WorldCoordinates.y; } set { WorldCoordinates.y = value; } }
    [XmlElement("WorldZ")]
    public float WorldZ { get { return WorldCoordinates.z; } set { WorldCoordinates.z = value; } }

    // 构造函数不变
}

最后验证

确保grid.gridTiles字典内有数据、grid.gridSize不为null,执行保存后即可生成包含完整内容的XML文件。

内容的提问来源于stack exchange,提问作者Mavis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:08:12