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/

10-13 06:00