public class Options
{
public FolderOption FolderOption { set; get; }
public Options()
{
FolderOption = new FolderOption();
}
public void Save()
{
XmlSerializer serializer = new XmlSerializer(typeof(Options));
TextWriter textWriter = new StreamWriter(@"C:\Options.xml");
serializer.Serialize(textWriter, this);
textWriter.Close();
}
public void Read()
{
XmlSerializer deserializer = new XmlSerializer(typeof(Options));
TextReader textReader = new StreamReader(@"C:\Options.xml");
//this = (Options)deserializer.Deserialize(textReader);
textReader.Close();
}
}
}
我设法毫无问题地保存,FolderOption的所有成员都反序列化了。但是问题是如何读回去?该行-//this =(Options)deserializer.Deserialize(textReader);将无法正常工作。
编辑:这个问题有解决方案吗?我们能在不分配这一目标的情况下实现相同的目的吗?那就是反序列化Options对象回到Option中。我懒得逐个属性(property)地做这件事。在最高水平上进行表演会节省很多精力。
最佳答案
如果您的“选项”类型为结构,则此方法将起作用,因为您可以更改结构本身。
如果Options是一个类(引用类型),则不能在该实例中将其分配给该引用类型的当前实例。建议您编写一个帮助器类,并在其中放置Read和Save方法,如下所示
public class XmlSerializerHelper<T>
{
public Type _type;
public XmlSerializerHelper()
{
_type = typeof(T);
}
public void Save(string path, object obj)
{
using (TextWriter textWriter = new StreamWriter(path))
{
XmlSerializer serializer = new XmlSerializer(_type);
serializer.Serialize(textWriter, obj);
}
}
public T Read(string path)
{
T result;
using (TextReader textReader = new StreamReader(path))
{
XmlSerializer deserializer = new XmlSerializer(_type);
result = (T)deserializer.Deserialize(textReader);
}
return result;
}
}
然后从调用方使用它,以读取和保存对象,而不是从类中尝试它。
//In the caller
var helper=new XmlSerializerHelper<Options>();
var obj=new Options();
//Write and read
helper.Save("yourpath",obj);
obj=helper.Read("yourpath");
并将XmlSerializerHelper放在您的Util命名空间中,它是可重用的,并且可以与任何类型一起使用。
关于C#-如何对对象本身进行xml反序列化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1081325/