【问题标题】:During Xml deserialization, matrix is returning null在 Xml 反序列化期间,矩阵返回 null
【发布时间】:2020-06-12 18:38:06
【问题描述】:

为反序列化以下 XML 文件进行了大量试验:

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.2" tiledversion="1.3.1" orientation="orthogonal" renderorder="right-down" compressionlevel="0" width="80" height="50" tilewidth="16" tileheight="16" infinite="0" nextlayerid="2" nextobjectid="1">
 <tileset firstgid="1" name="TilesetSA" tilewidth="16" tileheight="16" tilecount="4000" columns="80">
  <image source="../../TilesetSA.png" width="1280" height="800"/>
 </tileset>
 <layer id="1" name="Walls" width="80" height="50">
  <data encoding="csv">
3,3,3,3,3,3,3,3,3,3,3,3,3,3,
3,81,81,81,81,81,81,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,3,3,3,3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,
</data>
 </layer>
</map>

我没有机会更改 xml 文件,它必须保持原样。 我设法检索“map”、“tileset”和“image”的所有属性,但在“layer”元素中,只能检索属性(id、name、width、height),数据元素始终保持为空。

我为“map”、“tileset”、“layer”、“image”和“map”创建了专门的类。

有人能建议我解决这个“空结果”问题的代码吗?

【问题讨论】:

  • 您可以发布您为反序列化 XML 编写的代码吗?另外,Layer 的类签名是什么?

标签: c# xml deserialization


【解决方案1】:

使用以下 xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication159
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            string dataStr = (string)doc.Descendants("data").FirstOrDefault();

            int[][] results = dataStr.Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(y => int.Parse(y)).ToArray()).ToArray();
        }
    }
}

【讨论】:

  • 我附上了我写的代码:“代码提取”在主程序方法中,所有其他都是我创建的类
  • 在我看来,序列化程序类不是为我想做的事情而设计的,linq 似乎更容易处理,我现在正在尝试。
  • 如果您在 data 属性中创建一个 GET/SET 方法,该方法采用内部文本字符串并转换为数组,则序列化将起作用。
【解决方案2】:

我的代码如下:

        public virtual void WriteSaveXmlData(string pPath, int pRoom, bool pNewGame, int pX, int pY)
    {
        //xml save serialization
        XmlSaving XmlGameSave = new XmlSaving();
        XmlGameSave.SaveRootPath = pPath;
        XmlGameSave.SavedCurrentRoom = pRoom;
        XmlGameSave.XmlIsNewGame = pNewGame;
        XmlGameSave.XHero = pX;
        XmlGameSave.YHero = pY;

        XmlSerializer xs = new XmlSerializer(typeof(XmlSaving));

        using (StreamWriter wr = new StreamWriter(GameRound.GameSaveRootPath + GameRound.SaveFileName))
        {
            xs.Serialize(wr, XmlGameSave);
        }
    }
    public virtual XmlSaving ReadSaveXmlData()
    {
        //xml save deserialization

        XmlSerializer xs = new XmlSerializer(typeof(XmlSaving));

        using (StreamReader rd = new StreamReader(GameRound.GameSaveRootPath + GameRound.SaveFileName))
        {
            XmlSaving XmlGameSave = xs.Deserialize(rd) as XmlSaving;

            return XmlGameSave;

        }

    }
    public virtual XmlMap ReadXmlMapData(string pPath, int RoomNumber)
    {

        XmlMap ReadTmxData = new XmlMap();
        XmlSerializer TmxXmlMap = new XmlSerializer(typeof(XmlMap));
        using (StreamReader rd = new StreamReader(pPath + @"P1\RoomMapSaphir0" + RoomNumber + ".tmx"))
        {
            ReadTmxData = TmxXmlMap.Deserialize(rd) as XmlMap;
            return ReadTmxData;
        }


    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多