清空序列化XML文件

时间:2013-08-10 20:55:11

标签: c# xml-serialization

序列化对象后,我得到一个空的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";
    }
}

序列化和序列化对象由具有以下2个按钮的菜单调用:

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();
}

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

反序列化似乎有效但当然在Information中的data1变量中没有String,所以名为text的菜单中的变量也是空的。我没有错误,我可以在序列化后使用该对象。 那么为什么我的序列化不起作用呢?请帮我。我原谅我的英语和错误,我是stackoverflow的新手。

3 个答案:

答案 0 :(得分:4)

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; }
}

BTW:您不需要此Serializable属性。它仅由BinaryFormatter

使用

答案 1 :(得分:2)

我不确定,但是从我看到你没有任何公共领域...... Take a look here

而且,为什么不使用自动吸气器/设定器?

答案 2 :(得分:0)

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