【问题标题】:Empty serialized XML file空的序列化 XML 文件
【发布时间】:2013-08-10 20:55:10
【问题描述】:

我在序列化一个对象后得到一个空的 xmlfile。我正在使用Monodevelop和Unity 4。我在这个社区中搜索了很长时间,但我只发现了更难的问题:)我认为我的很简单,请帮助我。 (我是 C# 新手) 序列化的对象是这样的:

[System.Serializable]
public class information  {
    private string data1;
    private string data2;
    private string data3;

public void Data1(string text)
{
        data1 = text;
}
public string GetData1 ()
{
    return data1;   
}
    public void Data2(string text)
    {
        data2 = text;
    }
public string GetData2 ()
{
    return data2;   
}
    public void Data3(string text)
    {
        data3 = text;
    }
}

序列化类是这样的,问题可能出在这里:

public class SaveXml {
        public void SaveData(object obj, string filename)
{
        XmlSerializer sr = new XmlSerializer(obj.GetType());    
        TextWriter writer = new StreamWriter(filename);
        sr.Serialize(writer, obj);
        writer.Close();
    }

    public string Load()
{
    if(File.Exists("accdata.xml"))
    {
        XmlSerializer xs = new XmlSerializer(typeof(information));
        FileStream read = new FileStream("accdata.xml",FileMode.Open, FileAccess.Read, FileShare.Read);
        information info = (information)xs.Deserialize(read);
        return info.GetData1();
    }
    else
    {
        return "file does not exist";
    }
}

序列化和序列化对象由具有这两个按钮的菜单调用:

if(GUI.Button(new Rect(10,50,300,100),"Save"))
{
    SaveXml saver = new SaveXml();
    information infol = new information();
    infol.Data1("textone");
    infol.Data2("texttwo");
    infol.Data3( "textthree");
    saver.SaveData(infol, "accdata.xml");
}   
if(GUI.Button(new Rect(500,50,300,100),"Load"))
{
    SaveXml saver1 = new SaveXml();
    text = saver1.Load();
}

所以在类菜单中声明的​​变量文本应该是“textone”,在我单击保存按钮和加载按钮之后。保存按钮会创建一个空文件。

反序列化似乎有效,但信息中的 data1 变量中当然没有字符串,因此菜单中名为 text 的变量也是空的。我没有收到任何错误,并且可以在序列化后使用该对象。 那么为什么我的序列化不起作用?请帮我。我为我糟糕的英语和错误道歉,我是 stackoverflow 的新手。

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

    Xml 序列化程序序列化公共字段/属性而不是方法。将您的方法更改为属性。例如,

        public string Data2
        {
            set { data2 = value; }
            get { return data2; }
        }
    

    所以你的information 类可以是

    public class Information
    {
        public string Data1 { get; set; }
        public string Data2 { get; set; }
        public string Data3 { get; set; }
    }
    

    顺便说一句:你不需要这个Serializable 属性。仅供BinaryFormatter

    使用

    【讨论】:

    • 天啊,非常感谢!!我从没想过你的回答会这么快,你不会相信我有多高兴。 :) 可悲的是,我需要声誉给你一个大拇指 :( 它有效,但你能向我解释一下吗:我的方法改变了变量,这就是为什么我认为它会是一样的。你的 get 和 set 之间的区别在哪里?我的方法?
    【解决方案2】:

    我不确定,但据我所知,您没有任何公共字段...Take a look here

    还有,你为什么不直接使用自动 getter/setter 呢?

    【讨论】:

      【解决方案3】:

      根据this MSDN support article,使用 XmlSerializer 的方式只执行“浅”序列化 - 它只序列化公共字段/属性。序列化 私有 数据需要“深度”序列化,这似乎是另一种动物。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 2013-10-08
        • 2018-11-20
        相关资源
        最近更新 更多