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
相关产品推荐
相关产品推荐

