【问题标题】:OmitXmlDeclaration not working with XmlSerializerOmitXmlDeclaration 不适用于 XmlSerializer
【发布时间】:2011-05-07 18:43:23
【问题描述】:

我一直在为基于图块的游戏开发地图编辑器。我想加载地图并将其保存到 xml 文件中。

发现了 xmlSerializer 类并想尝试一下,而不是构建我自己的解析器。这并不难弄清楚。我现在遇到的一个问题是我无法摆脱 xml 声明。似乎根本没有应用 XmlSettings。整晚都在搞乱它,没有任何进展,非常感谢帮助。代码如下:

public static void SerializeMap(Array map) 
    { 
        XmlWriterSettings xmlSettings = new XmlWriterSettings(); 
        xmlSettings.OmitXmlDeclaration = true; 
        xmlSettings.ConformanceLevel = ConformanceLevel.Fragment; 
        xmlSettings.Indent = false; 

        var xmlSerializer = new XmlSerializer(typeof(Tile)); 


        XmlSerializerNamespaces emptyNameSpace = new XmlSerializerNamespaces(); 
        emptyNameSpace.Add("", ""); 

        //create string of xml first, then write to file 
        StringWriter stringWriter = new StringWriter(); 

       using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, xmlSettings)) 
       { 
            for (int z = 0; z < map.GetLength(0); z++) 
            { 
                for (int x = 0; x < map.GetLength(1); x++) 
                { 
                    for (int y = 0; y < map.GetLength(2); y++) 
                    { 
                        xmlSerializer.Serialize(stringWriter, map.GetValue(z, x, y), emptyNameSpace); 
                    } 
                } 
            } 
      } 

       FileStream fs = new FileStream("Content/tiletest.xml", FileMode.Create); 
        StreamWriter sw = new StreamWriter(fs); 

            sw.WriteLine(xmlText); 

        sw.Close(); 
        fs.Close(); 
}

因为我正在循环遍历对象,所以 xml 文件中的每个新写入对象都将附加一个 xml 声明,这将破坏 xml 格式。 令人难以置信的烦人,因为其他一切都可以在序列化中正常工作。

【问题讨论】:

  • 很有趣,也可能是一个错误。出于好奇,您可以尝试使用List&lt;Tile&gt; 而不是Array 吗?您能否在您的StringWriterFileStreamStreamReader 周围放置using 块?最后,xmlText 是什么?我看不出这是在哪里定义的。

标签: xna xml serialization


【解决方案1】:

您正在将 XmlWriterSettings 结构传递给 XmlWriter,但您没有在任何地方使用 XmlWriter 实例。 修复问题更改

xmlSerializer.Serialize(stringWriter, map.GetValue(z, x, y), emptyNameSpace);

xmlSerializer.Serialize(xmlWriter, map.GetValue(z, x, y), emptyNameSpace);

【讨论】:

    【解决方案2】:

    是的,不幸的是,XmlSerializer 并不太一致,尤其是在 windows 和 xbox 之间。这里有一个想法,使用内置的 XnaContent 序列化器。这是一个很好的教程:
    http://glennwatson.net/?p=143

    或来自 Microsoft 的文档:http://msdn.microsoft.com/en-us/library/ff604981.aspx

    注意:上面链接的 msdn 页面上的社区内容也参考了 Shawn Hargreave 关于该主题的优秀博文:

    【讨论】:

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