C# XmlSerializer;System.invalidOperationException异常

C# XmlSerializer;System.invalidOperationException异常,c#,xml,xml-serialization,C#,Xml,Xml Serialization,编辑:使用Jon Skeet提供的代码 我得到以下错误: Message: There is an error in XML document (2, 2). Inner Exception: {"<Translator xmlns=''> was not expected."} 短语 [Serializable] public enum PhraseID { none, Button_Start, Button_Stop, } 我是这样使用它的: 设置:

编辑:使用Jon Skeet提供的代码

我得到以下错误:

Message: There is an error in XML document (2, 2).
Inner Exception: {"<Translator xmlns=''> was not expected."}
短语

[Serializable]
public enum PhraseID
{
    none,
    Button_Start,
    Button_Stop,
}
我是这样使用它的:

设置:

private Translator _translator;
_translator = new Translator();
保存:

Helpers.XmlSerializerHelper.Serialize(
            System.AppDomain.CurrentDomain.BaseDirectory + "\\LanguagePacks\\" + langPackName.Text + ".xml",
            _translator);
装载:

        _translator = new Translator(); //yes this is needed ;)

        _translator.LoadLanguage(preloadedLangCombo.SelectedItem.ToString());
使用上述代码保存XML文件时,会输出以下内容:

English.XML:

<?xml version="1.0"?>
<Translator xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Translation>
    <Phrases>
      <Phrase>
        <PhraseID>none</PhraseID>
        <PhraseString>Incomplete Translation</PhraseString>
      </Phrase>
      <Phrase>
        <PhraseID>Button_Start</PhraseID>
        <PhraseString>Start</PhraseString>
      </Phrase>
      <Phrase>
        <PhraseID>Button_Stop</PhraseID>
        <PhraseString>Stop</PhraseString>
      </Phrase>
    </Phrases>
  </Translation>
</Translator>

没有一个
不完全翻译
启动按钮
开始
按钮停止
停止

不清楚这里出了什么问题-特别是因为错误消息似乎与示例XML不匹配。不过,您的异常处理很可能隐藏了问题——捕获所有这样的异常是一个非常糟糕的主意,而且您将花费不必要的时间来关闭相关的流。我将把你们的课程浓缩为:

public static class XmlSerializerHelper
{
    public static void Serialize(String path, object @object)
    {
        using (var stream = File.Create(path))
        {
            var s = new XmlSerializer(@object.GetType());
            s.Serialize(stream, @object);
        }
    }

    public static T Deserialize<T>(String path)
    {
        using (var stream = File.OpenRead(path))
        {
            var s = new XmlSerializer(typeof(T));
            return (T) s.Deserialize(stream);
        }
    }
}
公共静态类XmlSerializerHelper
{
公共静态void序列化(字符串路径,object@object)
{
使用(var stream=File.Create(path))
{
var s=新的XmlSerializer(@object.GetType());
s、 序列化(流,@object);
}
}
公共静态T反序列化(字符串路径)
{
使用(var stream=File.OpenRead(path))
{
var s=新的XmlSerializer(typeof(T));
返回(T)s.反序列化(流);
}
}
}
现在,如果出现问题,异常将传播到方法之外,而不是伪装。另外,请注意,我只对流进行了序列化,而没有涉及到
StreamWriter
。让XML基础设施处理所有编码更简单


在一个简单的测试中,上面的代码对我来说很好。

为什么有这么多空的catch块?(您几乎不应该有任何…)此外,当您使用
语句时,根本不需要手动关闭流。这就是您收到的错误消息吗?如果是这样的话,看起来像是某种腐败。
<?xml version="1.0"?>
<Translator xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Translation>
    <Phrases>
      <Phrase>
        <PhraseID>none</PhraseID>
        <PhraseString>Incomplete Translation</PhraseString>
      </Phrase>
      <Phrase>
        <PhraseID>Button_Start</PhraseID>
        <PhraseString>Start</PhraseString>
      </Phrase>
      <Phrase>
        <PhraseID>Button_Stop</PhraseID>
        <PhraseString>Stop</PhraseString>
      </Phrase>
    </Phrases>
  </Translation>
</Translator>
public static class XmlSerializerHelper
{
    public static void Serialize(String path, object @object)
    {
        using (var stream = File.Create(path))
        {
            var s = new XmlSerializer(@object.GetType());
            s.Serialize(stream, @object);
        }
    }

    public static T Deserialize<T>(String path)
    {
        using (var stream = File.OpenRead(path))
        {
            var s = new XmlSerializer(typeof(T));
            return (T) s.Deserialize(stream);
        }
    }
}