C#中如何通过类的静态属性完成XML序列化?

默认情况下,静态类无法被序列化,因为无法实例化对象;类的静态属性无法序列化,因为静态属性属于类而非具体实例。那么怎样才能实例化静态属性呢?可以用下面的方法:

建议看英文版:http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/687d1222-404e-4009-974e-9189280faa96

首先,XML序列化可以通过BinaryFormatter或者SoapFormatter实现。请按照以下步骤通过类的静态属性完成XML序列化。
1. 让类的静态属性实现ISerializable并且把这个类设为Serializable。
2. 实现GetObjectData方法。
3. 新建一个和GetObjectData方法相同结构的构造方法。

序列化过程中,这个类实际上调用了GetObjectData方法。反序列化时,类调用相同的构造方法实例化。
更多细节的内容,请参阅http://msdn.microsoft.com/en-us/magazine/cc301767.aspx

这里是含有静态属性的类:
    [Serializable]
    public class MyClass : ISerializable
    {
        static int? sindex;
        static int? len;

        public static int? StartIndex
        {
            get { return sindex; }
            set { sindex = value; }
        }
        public static int? Length
        {
            get { return len; }
            set { len = value; }
        }

        public MyClass()
        { }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("static.sindex", MyClass.sindex, typeof(int));
            info.AddValue("static.len", MyClass.len, typeof(int));
        }

        public MyClass(SerializationInfo info, StreamingContext context)
        {
            MyClass.sindex = info.GetInt32("static.sindex");
            MyClass.len = info.GetInt32("static.len");
        }
    }

一段序列化和反序列化的代码:
        private void BinarySerialize()
        {
            FileStream fileStream = new FileStream("test.binary", FileMode.Create);
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fileStream, myClass);
            fileStream.Dispose();
        }
        private void BinaryDeserialize()
        {
            FileStream fileStream = new FileStream("test.binary", FileMode.Open);
            BinaryFormatter bf = new BinaryFormatter();
            MyClass myClass = (MyClass)bf.Deserialize(fileStream);
            MessageBox.Show(MyClass.StartIndex.HasValue.ToString());
            MessageBox.Show(MyClass.StartIndex.Value.ToString());
        }
        private void SoapSerialize()
        {
            FileStream fileStream = new FileStream("test.soap", FileMode.Create);
            SoapFormatter sf = new SoapFormatter();
            sf.Serialize(fileStream, myClass);
            fileStream.Dispose();
        }
        private void SoapDeserialize()
        {
            FileStream fileStream = new FileStream("test.soap", FileMode.Open);
            SoapFormatter sf = new SoapFormatter();
            MyClass myClass = (MyClass)sf.Deserialize(fileStream);
            MessageBox.Show(MyClass.StartIndex.HasValue.ToString());
            MessageBox.Show(MyClass.StartIndex.Value.ToString());
        }
相关的帖子:
http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/687d1222-404e-4009-974e-9189280faa96

你可能感兴趣的:(C#中如何通过类的静态属性完成XML序列化?)