Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化为文件的单个对象类(如singleton)_C#_Visual Studio - Fatal编程技术网

C# 序列化为文件的单个对象类(如singleton)

C# 序列化为文件的单个对象类(如singleton),c#,visual-studio,C#,Visual Studio,我已经花了将近两个小时自己想办法了,但我真的没有什么好主意,所以我问你们,伙计们! 问题是我有一个类“Unit”,它包含一些公共属性。我创建了名为“UnitList”的类,它是许多“Unit”对象的列表。现在的问题是,我希望“UnitList”是一种数据库,以便进一步使用,我只需要该(“UnitList”)类的一个对象,我希望它使用标准XmlSerialization类序列化为文件。 现在我有了“UnitList”的构造函数,它应该从文件中读取数据并将其传输到所有程序中任何位置的新“UnitLi

我已经花了将近两个小时自己想办法了,但我真的没有什么好主意,所以我问你们,伙计们! 问题是我有一个类“Unit”,它包含一些公共属性。我创建了名为“UnitList”的类,它是许多“Unit”对象的列表。现在的问题是,我希望“UnitList”是一种数据库,以便进一步使用,我只需要该(“UnitList”)类的一个对象,我希望它使用标准XmlSerialization类序列化为文件。 现在我有了“UnitList”的构造函数,它应该从文件中读取数据并将其传输到所有程序中任何位置的新“UnitList”对象,但即使xml文件编写正确,每次声明它时都会得到新的空对象。 我怎样才能做到这一点?或者也许有更简单的方法可以做到这一点

编辑: 是的,当然,我的问题有关键代码。写入文件的示例:

private void button1_Click(object sender, EventArgs e) // --- Add ---
    {
        unit = new Unit(textBox1.Text, int.Parse(textBox2.Text), int.Parse(textBox3.Text), int.Parse(textBox4.Text),
                                            int.Parse(textBox5.Text), int.Parse(textBox6.Text), int.Parse(textBox7.Text),
                                            int.Parse(textBox8.Text), int.Parse(textBox9.Text), int.Parse(textBox10.Text), 
                                            int.Parse(textBox11.Text), textBox2.Text);
        unitList.AddUnit(unit);
        XmlSerialization.WriteToXmlFile<UnitList>("List.xml", unitList);
...
private void按钮1\u单击(对象发送者,事件参数e)/---添加---
{
单位=新单位(textBox1.Text、int.Parse(textBox2.Text)、int.Parse(textBox3.Text)、int.Parse(textBox4.Text),
int.Parse(textBox5.Text)、int.Parse(textBox6.Text)、int.Parse(textBox7.Text),
int.Parse(textBox8.Text)、int.Parse(textBox9.Text)、int.Parse(textBox10.Text),
int.Parse(textBox11.Text),textBox2.Text);
单位列表。添加单位(单位);
WriteToXmlFile(“List.xml”,unitList);
...
和我的XmlSerialization类:

public static class XmlSerialization
{
    public static void WriteToXmlFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
    {
        TextWriter writer = null;
        try
        {
            var serializer = new XmlSerializer(typeof(T));
            writer = new StreamWriter(filePath, append);
            serializer.Serialize(writer, objectToWrite);
        }
        finally
        {
            if (writer != null)
                writer.Close();
        }
    }

    public static T ReadFromXmlFile<T>(string filePath) where T : new()
    {
        TextReader reader = null;
        try
        {
            var serializer = new XmlSerializer(typeof(T));
            reader = new StreamReader(filePath);
            return (T)serializer.Deserialize(reader);
        }
        finally
        {
            if (reader != null)
            {
                reader.Close();
            }
...
公共静态类XmlSerialization
{
公共静态void WriteToXmlFile(字符串文件路径,T objectToWrite,bool append=false),其中T:new()
{
TextWriter=null;
尝试
{
var serializer=newxmlserializer(typeof(T));
writer=新StreamWriter(文件路径,追加);
serializer.Serialize(writer,objectToWrite);
}
最后
{
if(writer!=null)
writer.Close();
}
}
公共静态T ReadFromXmlFile(字符串文件路径),其中T:new()
{
TextReader=null;
尝试
{
var serializer=newxmlserializer(typeof(T));
reader=新的StreamReader(文件路径);
返回(T)序列化程序。反序列化(读取器);
}
最后
{
if(读卡器!=null)
{
reader.Close();
}
...
编辑2:

多亏了Pedro和一些“如果”的更正,我成功地将xml读入了我的对象。现在的问题是:

Exception:
There is an error in XML document (2, 2).

Inner Exception:
<UnitList xmlns=''> was not expected.
异常:
XML文档(2,2)中存在错误。
内部异常:
没有预料到。
我怀疑我的write函数将对象“UnitList”保存到XML文件中,但在read函数中,我将其读取为“List”。在这种情况下,这很重要吗?“UnitList”中更正的构造函数如下所示:

        public UnitList(string file)
    {
        if (File.Exists("List.xml") == false || XmlSerialization.ReadFromXmlFile<List<Unit>>(file) == null)
            unitList = new List<Unit>(500);
        else
            unitList = XmlSerialization.ReadFromXmlFile<List<Unit>>("List.xml");
    }
public UnitList(string file)
{
    unitList = XmlSerialization.ReadFromXmlFile<UnitList>("List.xml");
    if (unitList == null) 
        unitList = new List<Unit>(500);
}
公共单位列表(字符串文件)
{
if(File.Exists(“List.xml”)==false | | XmlSerialization.ReadFromXmlFile(File)==null)
单位列表=新列表(500);
其他的
unitList=XmlSerialization.ReadFromXmlFile(“List.xml”);
}

如果您愿意放弃XML,我建议您使用JSON格式。
Newtonsoft.JSON
是目前最流行的.NET JSON库之一

它还能够用一行代码序列化和反序列化列表,这将使您的代码更简洁

将对象列表序列化到文件:

List<Unit> Units = new List<Unit>();
File.WriteAllText(FilePath, JsonConvert.SerializeObject(Units));
并在代码中对其进行引用:

using Newtonsoft.Json;

此函数用于返回从文件中读取的列表:

public static T ReadFromXmlFile<T>(string filePath) where T : new()
公共静态T ReadFromXmlFile(字符串文件路径),其中T:new() 但在构造函数中,您只需调用它,就可以将变量设置为结果:

XmlSerialization.ReadFromXmlFile<UnitList>("List.xml");
XmlSerialization.ReadFromXmlFile(“List.xml”);
您需要将unitlist值设置为调用的结果。构造函数代码应如下所示:

        public UnitList(string file)
    {
        if (File.Exists("List.xml") == false || XmlSerialization.ReadFromXmlFile<List<Unit>>(file) == null)
            unitList = new List<Unit>(500);
        else
            unitList = XmlSerialization.ReadFromXmlFile<List<Unit>>("List.xml");
    }
public UnitList(string file)
{
    unitList = XmlSerialization.ReadFromXmlFile<UnitList>("List.xml");
    if (unitList == null) 
        unitList = new List<Unit>(500);
}
公共单位列表(字符串文件)
{
unitList=XmlSerialization.ReadFromXmlFile(“List.xml”);
if(unitList==null)
单位列表=新列表(500);
}
编辑: 要处理类型不匹配,而不是在构造函数中读取,您应该将其作为返回UnitList实例的静态方法来执行

private static UnitList LoadUnitList()
{
        UnitList result = null;
        if (File.Exists("List.xml") == true)
        {
            result = XmlSerialization.ReadFromXmlFile<UnitList>("List.xml");
        }

        if (result == null) 
            result = new UnitList();

        return result;
}
private静态单位列表LoadUnitList()
{
单位列表结果=null;
if(File.Exists(“List.xml”)==true)
{
结果=XmlSerialization.ReadFromXmlFile(“List.xml”);
}
如果(结果==null)
结果=新单位列表();
返回结果;
}

也许一些关于您如何读取/写入文件的代码会有所帮助。您的这部分工作正常了吗?请提供您的代码是的,谢谢您指出,另外,我必须修改IF语句,以涵盖没有文件或文件为空的情况……但还有更多问题……;]您正在编写UnitList类,但正在读取内部列表。这就是读取中存在类型不匹配的原因。您还需要写入内部变量UnitList.UnitList。或者,您需要一个返回UnitList反序列化实例的静态方法。也许您还可以发布保存的xml文件,以便我们可以看到保存的格式。上面我猜测可能是加载问题。
错误1无法分配给隐式类型的局部变量
-我们似乎无法初始化“结果”使用null;]尝试使用实际类型的UnitList而不是var。感谢您为XML序列化提供了更简单的替代方法,但要达到我现在的目的需要付出很多努力,我希望它能够正常工作。