代码之家  ›  专栏  ›  技术社区  ›  bradenb

启动时加载时反序列化导致InvalidOperationException

  •  1
  • bradenb  · 技术社区  · 14 年前

    我有一个类,可以在我的WPF应用程序加载后轻松地序列化和反序列化。我现在正试图添加在传入项目文件时在启动时加载项目的功能。不幸的是,它正在引发InvalidOperationException,声明:

    There is an error in XML document (2, 2). ---> System.InvalidOperationException: <WeightingParametersBit xmlns=''> was not expected.

    这个 WeightingParametersBit 是我试图序列化的类的成员的类型。它基本上只是一个字典的容器。奇怪的是,文件不包含 <WeightingParametersBit xmlns=.... 文件中的任何地方。一旦抛出此异常并启动应用程序。如果单击“加载”按钮并选择同一个项目文件,则加载效果会很好。

    public class WeightSettings
    {
        public double UserScoreSlagging;
        public double UserScoreFouling;
        public WeightMode BitWeightMode = WeightMode.Manual;
        public WeightMode LigWeightMode = WeightMode.Manual;
        public WeightingParametersBit BitWeights = new WeightingParametersBit();
        public WeightingParametersLig LigWeights = new WeightingParametersLig();
    }
    

    下面是它生成的xml(为了查看目的而缩减):

    <?xml version="1.0" encoding="utf-8"?>
    <WeightSettings>
        <UserScoreSlagging>0</UserScoreSlagging>
        <UserScoreFouling>0</UserScoreFouling>
        <BitWeightMode>Manual</BitWeightMode>
        <LigWeightMode>Manual</LigWeightMode>
        <BitWeights>
            <bituminous>
                ...
            </bituminous>
        </BitWeights>
        <LigWeights>
            <lignitic>
              ...
            </lignitic>
        </LigWeights>
    </WeightSettings>
    

    我的泛型序列化代码:

    public static void Serialize<T>(this T source, TextWriter writer)
    {
        // Don't serialize a null object
        if (Object.ReferenceEquals(source, null))
        {
            throw new ArgumentException("Trying to serialize null object.", "source");
        }
    
        XmlSerializer s = new XmlSerializer(typeof(T));
        s.Serialize(writer, source);
        writer.WriteLine();
    }
    

    反序列化代码:

    public static T Deserialize<T>(this T source, TextReader reader)
    {
        XmlSerializer s = new XmlSerializer(typeof(T));
        source = (T)s.Deserialize(reader);
        return source;
    }
    

    对反序列化的调用来自名为 WeightSettings 权重设置 )不为空:

    WeightSettings = WeightSettings.Deserialize(sr);

    我怎样才能纠正这种行为?或许更重要的是:为什么我只在加载了窗口的事件上看到这种行为?

    1 回复  |  直到 14 年前
        1
  •  0
  •   bradenb    14 年前

    @乔恩·斯凯特在正确的轨道上。直到应用程序完全加载后,我才更改当前工作目录,因此它找不到该文件。

    FileNotFoundException