Unity读取自定义XML生成3D模型时XmlSerializer容器读取错误求解
问题原因及修复方案
1. 序列化匹配逻辑修正
你注释的XML序列化特性为必填项,需要和实际XML的节点结构完全对应,XML规范不允许节点/属性名包含空格,若原XML有类似命名需要先调整XML格式再对应配置特性:
// 匹配XML根节点,括号内填你的实际根节点名称 [XmlRoot("model_version")] public class Container { // 第一个参数填块列表的父节点名称,第二个参数填单个块的节点名称 [XmlArray("block_list")] [XmlArrayItem("block", typeof(Load))] public List<Load> Load_container = new List<Load>(); } public class Load { // 若坐标是block节点的属性用XmlAttribute,若是子节点则改为XmlElement,括号内填实际字段名 [XmlAttribute("x_position")] public float x_position; [XmlAttribute("y_position")] public float y_position; [XmlAttribute("z_position")] public float z_position; }
2. UTF-8编码+路径适配优化
直接用FileStream读取容易出现编码不兼容、路径识别错误问题,改为指定UTF-8编码读取,同时适配Unity的路径规则:
public class LoadFile: MonoBehaviour { // 建议将XML放在StreamingAssets文件夹下,此处填相对StreamingAssets的路径,如"custom_model.xml" public string relativePathInStreamingAssets; void Start() { string fullPath = Path.Combine(Application.streamingAssetsPath, relativePathInStreamingAssets); if (!File.Exists(fullPath)) { Debug.LogError($"XML文件不存在:{fullPath}"); return; } try { var serializer = new XmlSerializer(typeof(Container)); // 显式指定UTF8编码,兼容带BOM的UTF-8文件 using (var reader = new StreamReader(fullPath, System.Text.Encoding.UTF8)) { var container_load = (Container)serializer.Deserialize(reader); // 测试读取结果 Debug.Log($"加载成功,共{container_load.Load_container.Count}个块数据"); } } catch (Exception e) { // 输出具体错误,可直接定位是节点不匹配还是编码问题 Debug.LogError($"解析错误:{e.Message}\n{e.StackTrace}"); } } }
3. 额外排查点
- 提前验证XML文件格式合法性,避免未闭合标签、特殊字符等格式错误
- 优先将XML放入
StreamingAssets目录,打包时勾选文件的Copy to Output Directory选项,避免打包后文件丢失 - 若解析仍报错,可根据异常日志里的节点匹配提示,调整特性参数和XML结构完全对齐
内容的提问来源于stack exchange,提问作者Orry
相关产品推荐
相关产品推荐

