我用gdi+画图,画完想把每个图形的属性存起来,便于以后加载,修改。图形类是从ShapeBase类继承的,Shapes类中一个ArrayList来存放图形。怎样实现序列化?MSDN上说:XmlSerializer 无法序列化或反序列化以下数组ArrayList 的数组
List 的数组,该如何处理?

解决方案 »

  1.   

    private string myXmlSerializer(object o)
                {
                    XmlSerializer ser = new XmlSerializer(o.GetType());
                    System.IO.MemoryStream mem = new MemoryStream();
                    XmlTextWriter writer = new XmlTextWriter(mem, Encoding.Default);
                    ser.Serialize(writer, o);
                    writer.Close();
                    return Encoding.Default.GetString(mem.ToArray());
                }反序列化的函数
    private object myXmlDeserialize(string s, Type t)
            {
                XmlSerializer mySerializer = new XmlSerializer(t);
                StreamReader mem2 = new StreamReader(new MemoryStream(System.Text.Encoding.Default.GetBytes(s)), System.Text.Encoding.Default);
                return mySerializer.Deserialize(mem2);
            }
      

  2.   

    <?xml version="1.0" encoding="utf-8"?><Shapes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><List xsi:type="Rect"><penWidth>1</penWidth><penColor /><X1>243</X1><Y>57</Y><X>126</X><Y1>115</Y1></List><List xsi:type="Ell"><penWidth>1</penWidth><penColor /><X1>354</X1><Y>52</Y><X>275</X><Y1>102</Y1></List><List xsi:type="Rect"><penWidth>1</penWidth><penColor /><X1>306</X1><Y>132</Y><X>220</X><Y1>172</Y1></List></Shapes>  这是序列化之后的XML文档,但是在反序列化的时候,得不到对象的类型,是怎么回事?是和我定义的ArrayList有关吗?我在反序列化之后是需要重绘的,如果不用ArrarList,又该如何处理?
      

  3.   

    ArrayList中的自定义类需要自己实现序列化和反序列化。
      

  4.   

    你的自定义的类有Serializable没?如果你的自定义类里面的属性都是一些常规的定义,如string,int等,就可以直接在类加入Attribute,如:
        [Serializable]
        public class Accreditation
        {。如果里面含有一些无法进行序列化的属性定义,你需要继承IXmlSerializable接口,对无法进行序列化的属性进行自定义,如将二进制的内容(如Bitmap)进行自定义序列化为XML后,还需要对反序列化将XML中的内容转为二进制内容。
      

  5.   

    我用GDI+画的图需要能重新加载修改,如果保存成png就不能修改了。在精简框架下没有二进制序列化,所以想用xml序列化,可是怎么也做不了,自定义的类没有写[Serializable] ,总是提示缺少using,不知道该怎么处理?
    如果不用序列化,怎样才能加载之前绘过的图?(可以修改)
      

  6.   

    自定义序列化,实现IXmlSerializable接口,提醒下brush是不能序列化的。
      

  7.   

    命名空间是
    System.SerializableAttribute
      

  8.   

    实现IXmlSerializable接口的类必须具有无参数构造函数,我定义的类都有参数呀