有关.NET中序列化的一些知识

时间:2025-03-27 10:35:02
         要实现上述类的实例的序列化,可参照如下例子:
        MEABlock myBlock = new MEABlock();
        // Insert code to set properties and fields of the object.
        XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));
        // To write to a file, create a StreamWriter object.
        StreamWriter myWriter = new StreamWriter("");
        (myWriter, MEABlock);

    需要注意的是XML序列化只会将public的字段保存,对于私有字段不予于保存。
    生成的XML文件格式如下:
       
<MEABlock>
            <Caption>Test</Caption>
        </MEABlock>
    对于对象的反序列化,则如下:
       
MEABlock myBlock;
       
// Constructs an instance of the XmlSerializer with the type
        // of object that is being deserialized.

        XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));
        // To read the file, creates a FileStream.
        FileStream myFileStream = new FileStream("", );
       
// Calls the Deserialize method and casts to the object type.
        myBlock = (MEABlock)(myFileStream)

    2、二进制序列化
        与XML序列化不同的是,二进制序列化可以将类的实例中所有字段(包括私有和公有)都进行序列化操作。这就更方便、更准确的还原了对象的副本。
        要实现上述类的实例的序列化,可参照如下例子:
        MEABlock myBlock = new MEABlock();
        // Insert code to set properties and fields of the object.
        IFormatter formatter = new BinaryFormatter();
        Stream stream = new FileStream("",,, );
        (stream, myBlock);
        ();

    对于对象的反序列化,则如下:
        IFormatter formatter = new BinaryFormatter();
        Stream stream = new FileStream("", ,, );
        MEABlock myBlock = (MEABlock) (stream);
        ();

三、如何变相实现自定义可视化控件的序列化、反序列化
        对于WinForm中自定义控件,由于继承于类,而Form类又是从MarshalByRefObject继承的,窗体本身无法做到序列化,窗体的实现基于Win32下GUI资源,不能脱离当前上下文存在。
        当然可以采用变通的方法实现控件的序列化。这里采用的是记忆类模型
        定义记忆类(其实就是一个可序列化的实体类)用于记录控件的有效属性,需要序列化控件的时候,只需要将该控件的实例Copy到记忆类,演变成序列化保存该记忆类的操作。
        反序列化是一个逆过程。将数据流反序列化成为该记忆类,再根据该记忆类的属性生成控件实例。而对于控件的一些事件、方法则可以继续使用。