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