大家好,我们知道当我们要让一个类可以序列化时,要加上[Serializable]的标记,而且这个标记是不可继承的,小弟有一天忘了加这个标记,竟然可以序列化出来,所以想在这里请教各位大侠,原因何在?
代码如下:namespace TestDemo {
    public class A
    {
        public int xx = 1;
        public B b = new B();
    }
    public class B
    {
        public ArrayList arr = new ArrayList();
        public B()
        {
            arr.Add("Test");
        }
    }
    class Program {
        public static string XmlSerializerToString(object obj)
        {
            XmlSerializer xs = new XmlSerializer(obj.GetType());
            MemoryStream stream = new MemoryStream();
            xs.Serialize(stream, obj);
            stream.Position = 0;
            StreamReader sr = new StreamReader(stream);
            string result = sr.ReadToEnd();
            sr.Close();
            stream.Close();
            return result;
        }
        static void Main(string[] args) {
            A a = new A();
            string s=XmlSerializerToString(a);
            Console.WriteLine(s);
            Console.ReadKey();
        }
    }
}

解决方案 »

  1.   

    XmlSerializer 不考虑[Serializable],它默认只对内部public属性进行序列化,当遇到无法序列化的属性才会报错。
      

  2.   

    XML 序列化是将对象的公共属性 (Property) 和字段转换为序列格式(这里是指 XML)以便存储或传输的过程。默认情况下类都是不可序列化的,除非使用 SerializableAttribute 进行标记。(这里的类是指对象公共属性的类)你的A中公共属性一个int可以序列化,B不可序列化,所以OK。
      

  3.   


    您的意思是说A中的int 字段能够序列化,但B 字段不行吗?可是我调试的结果是这样:
    <?xml version="1.0"?>
    <A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w
    3.org/2001/XMLSchema">
      <xx>1</xx>
      <b>
        <arr>
          <anyType xsi:type="xsd:string">Test</anyType>
        </arr>
      </b>
    </A>
      

  4.   

    ArrayList是可以xml序列化的,所以使用XmlSerializer没有问题。但是如果使用到Cache上面去的话就有问题了,因为Cache上面必须使用二进制序列化。
      

  5.   

    XML序列化时不需要加[Serializable]标记,
    但要注意的是序列化对象(类)必须是公共的(public)