C#:如何从类内部写入类?

C#:如何从类内部写入类?,c#,xml-serialization,this,C#,Xml Serialization,This,我试图创建一个类,该类可以通过使用.NET XmlSerializer类在XML文件中对自身进行序列化和反序列化。我已经有了save功能(“SaveSettings”)来工作,但是加载功能并不是那么简单 目前,我必须将类变量的引用传递给函数,以使加载函数正常工作(“LoadSettings2”),理想的做法是只使用“this”关键字(“LoadSettings”)是否创建只需要传递文件路径的LoadSettings函数 Program.cs: class Program { static

我试图创建一个类,该类可以通过使用.NET XmlSerializer类在XML文件中对自身进行序列化和反序列化。我已经有了save功能(“SaveSettings”)来工作,但是加载功能并不是那么简单

目前,我必须将类变量的引用传递给函数,以使加载函数正常工作(“LoadSettings2”),理想的做法是只使用“this”关键字(“LoadSettings”)是否创建只需要传递文件路径的LoadSettings函数

Program.cs:

class Program
{
    static void Main(string[] args)
    {
        ApplicationSettings appSet = new ApplicationSettings();
        appSet.SourceDirectory = "here";
        appSet.DestinationDirectory = "there";

        appSet.SaveSettings(@"C:\Users\Connor\Desktop\Folder A\a.xml");
        //appSet.LoadSettings(@"C:\Users\Connor\Desktop\Folder A\a.xml"); //Doesn't work
        appSet.LoadSettings2(ref appSet, @"C:\Users\Connor\Desktop\Folder A\a.xml");
    }
}
ApplicationSettings.cs:

public class ApplicationSettings
{
    //Serialized
    public string SourceDirectory;
    public string DestinationDirectory;

    //Not Serialized
    public void SaveSettings(string filePath)
    {
        XmlSerializer XSerializer = new XmlSerializer(typeof(ApplicationSettings));
        StreamWriter strWrite = new StreamWriter(filePath);

        XSerializer.Serialize(strWrite, this);
        strWrite.Close();
    }

    public void LoadSettings(string filePath)
    {
        XmlSerializer XSerializer = new XmlSerializer(typeof(ApplicationSettings));
        StreamReader strRead = new StreamReader(filePath);

        //Ideal but will not work
        //this = (ApplicationSettings)XSerializer.Deserialize(strRead);
        strRead.Close();
    }

    public void LoadSettings2(ref ApplicationSettings appSettings, string filePath)
    {
        XmlSerializer XSerializer = new XmlSerializer(typeof(ApplicationSettings));
        StreamReader strRead = new StreamReader(filePath);

        appSettings = (ApplicationSettings)XSerializer.Deserialize(strRead);
        strRead.Close();
    }
}
-

--答复---


通过执行“David M”建议的成员对成员的复制使其正常工作,但通过使用System.Reflection实现,这意味着没有使用变量名。我相信只有公共变量被复制,类需要更多的测试。执行10k迭代大约需要1.8秒

public void LoadSettings(string filePath)
{
    XmlSerializer XSerializer = new XmlSerializer(typeof(ApplicationSettings));
    StreamReader strRead = new StreamReader(filePath);
    ApplicationSettings settingsRead = (ApplicationSettings)XSerializer.Deserialize(strRead);

    foreach (var field in typeof(ApplicationSettings).GetFields())
    {
        field.SetValue(this, field.GetValue(settingsRead));
    }

    strRead.Close();
}
public void LoadSettings(string filePath)
{
    XmlSerializer XSerializer = new XmlSerializer(typeof(ApplicationSettings));
    StreamReader strRead = new StreamReader(filePath);
    ApplicationSettings settingsRead = (ApplicationSettings)XSerializer.Deserialize(strRead);

    foreach (var field in typeof(ApplicationSettings).GetFields())
    {
        field.SetValue(this, field.GetValue(settingsRead));
    }

    strRead.Close();
}

改为使用静态工厂方法:

public static ApplicationSettings LoadSettings(string filePath)
{
    XmlSerializer XSerializer = new XmlSerializer(typeof(ApplicationSettings));
    using (StreamReader strRead = new StreamReader(filePath))
    {
        var result = (ApplicationSettings)XSerializer.Deserialize(strRead);
    }
    return result;
}

否则,您必须反序列化到另一个实例,然后逐个成员将值复制到当前实例。注意:最好使用
块作为
StreamReader
-调用
Dispose
将确保释放文件句柄。

为什么不使用
LoadSettings()
静态
方法并这样调用它:

ApplicationSettings applicationSettings = ApplicationSettings.LoadSettings();

通过执行“David M”建议的成员对成员的复制使其正常工作,但通过使用System.Reflection实现,这意味着没有使用变量名。我相信只有公共变量被复制,类需要更多的测试。执行10k迭代大约需要1.8秒

public void LoadSettings(string filePath)
{
    XmlSerializer XSerializer = new XmlSerializer(typeof(ApplicationSettings));
    StreamReader strRead = new StreamReader(filePath);
    ApplicationSettings settingsRead = (ApplicationSettings)XSerializer.Deserialize(strRead);

    foreach (var field in typeof(ApplicationSettings).GetFields())
    {
        field.SetValue(this, field.GetValue(settingsRead));
    }

    strRead.Close();
}
public void LoadSettings(string filePath)
{
    XmlSerializer XSerializer = new XmlSerializer(typeof(ApplicationSettings));
    StreamReader strRead = new StreamReader(filePath);
    ApplicationSettings settingsRead = (ApplicationSettings)XSerializer.Deserialize(strRead);

    foreach (var field in typeof(ApplicationSettings).GetFields())
    {
        field.SetValue(this, field.GetValue(settingsRead));
    }

    strRead.Close();
}

我是从程序员的角度来看的,拥有调用load和save函数的相同方法是理想的。我正在考虑将其设置为OO,这样它就可以成为一个基类,由其他设置类继承(我不知道这是否可能,更好地理解OO内容只是一个有趣的项目想法。)但对于回答我最初的问题,是的,你是对的,谢谢。如果你使用了属性而不是字段,它们将被序列化。