【问题标题】:Error in: C# XML serialization/deserialization错误:C# XML 序列化/反序列化
【发布时间】:2012-06-11 17:36:32
【问题描述】:

这是实际的代码,不是完整的代码,而是它的主要部分。 基本上这里我在写一个插件,它实现了一些接口,我需要存储插件的状态,因为它在整个过程中运行了多次。但是通过 xml 存储状态会产生错误

using System;

【问题讨论】:

  • xml文件的内容是什么?

标签: c# serialization deserialization


【解决方案1】:

您的代码无法编译。使用您创建的state 实例,而不是尝试设置非静态字段。还要确保通过将 IDisposable 资源包装在 using 语句中来正确处理它们:

using System.IO;
using System.Xml.Serialization;

namespace Plugin
{
    public class state
    {
        public int a;
        public int b;
    }
    public class xyz
    {
        public static void Main()
        {
            state s = new state();
            s.a = 3;
            s.b = 5;
            XmlSerializer x = new XmlSerializer(s.GetType());
            using (StreamWriter sw = new StreamWriter(@"E:\state\state.xml"))
            {
                x.Serialize(sw, s);
            }
        }
    }
}

生成以下 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<state xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <a>3</a>
  <b>5</b>
</state>

【讨论】:

  • 哎呀!我的错。我更正了我的代码,即使按照您的建议将其包装在 using 语句中,仍然存在相同的错误:“生成 xml 文档时出错”
  • 嗯,不,我已经测试过这段代码,它工作得很好。我将更新以发布完整的 sn-p。确保您运行此代码的进程对E:\state 文件夹具有写入权限。
  • 文件正在生成,但没有写入任何内容。
  • 看,我的代码是项目的一部分,如果我独立运行它,你的代码工作得非常好,但是如果我在我的实际项目中编写相同的代码,它就会出错!告诉我如何向您展示我的原始代码?
  • 发布您获得的完整异常堆栈跟踪。
【解决方案2】:

序列化字段也不是一个好主意,你应该使用属性

public class state
{
    public int A { get; set; }
    public int B { get; set; }
}

state s = new state() { A = 3, B = 6 };

XmlSerializer x = new XmlSerializer(s.GetType());
using (StreamWriter sw = new StreamWriter(@"E:\state\state.xml"))
{
   x.Serialize(sw, s);
}

【讨论】:

  • 因为你有更好的控制能力,可以做验证等事情。
【解决方案3】:

您的代码无法编译,因为您使用的是类(状态)的名称而不是变量(s)。

以下代码工作并使用 using 来确保即使发生异常也会关闭流:

        var s = new state {a = 3, b = 5};

        var x = new XmlSerializer(typeof(state));
        using(var sw = new StreamWriter(@"E:\state\state.xml"))
            x.Serialize(sw, s);

【讨论】:

  • 你为什么总是重复同样的答案,比如stackoverflow.com/a/10984736/932418
  • 可能是巧合,但有时会发生:在你开始写你的答案之后,他开始写他的答案。您发布,他仍在编辑(并且不会重新加载新答案),然后最后发布。 boom 重复答案。 StackOverflow 不是线程安全的发布环境;)
猜你喜欢
  • 2018-06-04
  • 2011-08-09
  • 2011-05-12
  • 2014-03-13
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多