【问题标题】:Error deserializing XML exported from BMFont tool反序列化从 BMFont 工具导出的 XML 时出错
【发布时间】:2015-09-29 17:06:48
【问题描述】:

我正在尝试使用以下示例:http://www.faqstackoverflow.com/answered/using-a-bmp-image-as-font-in-monogame

这个概念似乎是合理的。我正在使用建议的工具生成的 .fnt。根据类中使用的 [Serialization],它看起来格式正确且有意义。

但是,每次我运行代码时都会收到此错误:“System.Xml.dll 中发生了 'System.InvalidOperationException' 类型的未处理异常

附加信息:XML 文档 (1, 1) 中存在错误。"

我在 StackExchange 和 google 周围狂热地寻找,并在来到这里发布我的问题之前尝试了很多东西。在我正在修改的 FontLoader 类中下面发布的 cmets 中,这些尝试留下的许多杂乱的结果仍然存在,我正在修改以尝试解决问题。无论如何切片,都会出现同样的错误,甚至更糟。

    public class FontLoader
{
    public static FontFile Load(String filename)
    {
           /* XmlSerializer deserializer = new XmlSerializer(typeof(FontFile));
            TextReader textReader = new StreamReader(Encoding.UTF8.GetBytes(filename).ToString());
            FontFile file = (FontFile)deserializer.Deserialize(textReader);
            textReader.Close();
            return file;*/


byte[] bytes = Encoding.UTF8.GetBytes(System.IO.File.ReadAllText(filename));
FontFile myInstance = null;
using (MemoryStream memStream = new MemoryStream(bytes))
{
XmlSerializer tokenSerializer = new XmlSerializer(typeof(FontFile));
myInstance = (FontFile)tokenSerializer.Deserialize(memStream);
Console.WriteLine(myInstance);
return myInstance;
}

/*
        XmlSerializer deserializer = new XmlSerializer(typeof(FontFile));
        TextReader textReader = new StreamReader(filename);
        FontFile file = (FontFile)deserializer.Deserialize(textReader);
        textReader.Close();
        return file;*/

/*         var xml = System.IO.File.ReadAllText(filename);
        using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(FontFile));
            FontFile file = (FontFile)serializer.Deserialize(stream);
            return file;
        }*/

     /*   var writer = new StringWriter();
        var serializer = new XmlSerializer((filename.GetType()));
        serializer.Serialize(writer, filename);
        string xml = writer.ToString();
        return xml;*/

    }
}

我使用的字体是Arial,作为测试,所以应该可以使用。它从以下几行开始:

info face="Arial" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=32 base=26 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="arial_0.png"
chars count=191
char id=32   x=155   y=75    width=3     height=1     xoffset=-1    yoffset=31    xadvance=8     page=0  chnl=15

接着是许多具有相同结构的“char”行,然后是字距调整行,然后是一堆结构相同的“字距调整”行,如下所示:

kernings count=91
kerning first=32  second=65  amount=-2  

如果序列化最终出现问题,我很抱歉冒充,但我没有看到它。请让我知道是否有人有解决方案。谢谢。

【问题讨论】:

    标签: c# xml fonts bitmap monogame


    【解决方案1】:

    从你原来的问题来看,这个问题实际上很明显,但和你一样,我一开始忽略了这个问题。

    在您向我发送.fnt 文件后,我几乎立即发现了这个问题,因为我将它与我之前导出的文件进行了比较。问题是您以错误的格式导出了文件。正如您在问题中所说,您的文件如下所示:

    info face="Arial" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
    common lineHeight=32 base=26 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
    page id=0 file="arial_0.png"
    chars count=191
    char id=32   x=155   y=75    width=3     height=1     xoffset=-1    yoffset=31    xadvance=8     page=0  chnl=15
    

    但它应该看起来更像这样:

    <?xml version="1.0"?>
    <font>
      <info face="Arial" size="32" bold="1" italic="0" charset="" unicode="1" stretchH="100" smooth="1" aa="1" padding="0,0,0,0" spacing="1,1" outline="1"/>
      <common lineHeight="32" base="26" scaleW="256" scaleH="256" pages="1" packed="0" alphaChnl="1" redChnl="0" greenChnl="0" blueChnl="0"/>
      <pages>
        <page id="0" file="arial_0.png" />
      </pages>
      <chars count="191">
    

    将它们并排比较后,差异就很明显了。第一个文件是纯文本,第二个文件是 XML。它发生在我们最好的人身上:)

    无论如何,要修复它,您只需在 BMFont 工具中将文件格式设置为 XML。

    1. 点击选项
    2. 点击导出选项
    3. 点击对话框底部附近的XML单选按钮

    然后再次导出您的文件。

    【讨论】:

    • 哦哇...我认为自定义类应该根据预期的模式将纯文本转换为 xml,然后反序列化它,基于我的假设纯文本就是 BM Font 做了一些事情,由.net 应用程序将其修复为 xml。哈......默认是文本我什至不知道你可以改变它。非常感谢!
    • 不客气。我们最终可以支持 MonoGame.Extended 中的所有不同格式,但由于它只有 1 次点击,所以目前不是优先事项。很高兴你让它工作:)
    【解决方案2】:

    自从您所指的答案被编写以来,一些事情发生了变化。您可以使用MonoGame.Extended 库来完成您想要做的事情,而不是自己编写它。不久前我写了一个详细的blog post

    您需要做的第一件事是install the MonoGame.Extended NuGet package。在包管理器控制台中运行以下命令。

    Install-Package MonoGame.Extended -Pre
    

    安装后,您的包文件夹中将有几个 DLL。 MonoGame Pipeline 工具需要引用其中之一。最简单的方法是在文本编辑器中手动编辑您的Content.mgcb 文件。像这样添加参考线,但一定要匹配当前版本。

    #-------------------------------- References --------------------------------#
    
    /reference:..\..\packages\MonoGame.Extended.0.3.44-alpha\lib\MonoGame.Extended.Content.Pipeline.dll
    

    最后,您可以将字体文件和纹理添加到 MonoGame Pipeline 工具中,然后像任何其他内容一样加载。

    _bitmapFont = Content.Load<BitmapFont>("my-font");
    

    然后使用精灵批处理绘制它

    _spriteBatch.Begin();
    _spriteBatch.DrawString(_bitmapFont, "Hello World", new Vector2(100, 200), Color.Red);
    _spriteBatch.End();
    

    如果您确实想自己编写,可以查看implementation from MonoGame.Extended,因为它是开源的。

    【讨论】:

    • 嗨,谢谢。我希望一旦通过下一个问题,我会给这个接受的答案检查,我很高兴能够做你的扩展承诺的事情。不过,现在,我遇到了与“松散代码”尝试相同的错误。 xml 中的 1,1 处有错误。这是使用 BM 字体工具重新创建的 .fnt。重建内容时发生错误...... png成功,.fnt失败,“BitmapFontImporter”出现意外失败!详细信息是 1,1 的 xml 文档中存在错误,并且序列化问题...
    • 有趣。你能把字体文件和它的纹理压缩起来,然后以某种方式发布一个链接,这样我就可以下载它了。我看看能不能发现问题。
    • 感谢您的关注。我希望你能在这里找到文件和问题drive.google.com/file/d/0BxA8WLGSiKm-MmFSQmptVmw4OUE/…
    • @user3421630 抱歉,过了一段时间才回复您。当你今天早上发送文件时,我正在打电话去上班,直到现在我才有机会查看它。我已将解决方案作为另一个答案发布,因为它与第一个答案完全不同,但我认为它们对任何解决这个问题的人都有价值。随意接受你喜欢的任何一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多