序列化树视图时丢失数据

时间:2015-09-17 02:41:00

标签: c# serialization treeview

我正在用C#编写一个程序,它将数据分配给一个类,然后将该类分配给treeview节点的Tag Value。

我可以使用我在此处找到的答案将我的treeview序列化为文件:Saving content of a treeview to a file and load it later

但是,在反序列化文件时,使用此方法丢失了所有节点的标记,或者更可能的是,它们甚至不是首先被序列化。

使用此方法序列化时是否可以保留节点的Tag值?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:0)

BinaryFormatter成功序列化,您的Tag对象必须标记为[Serializable],这表示可以通过序列化其公共和私有来成功序列化和反序列化字段。如果它被标记,则序列化为TreeNode的一部分,如reference source所示:

[TypeConverterAttribute(typeof(TreeNodeConverter)), Serializable,
DefaultProperty("Text"),    
SuppressMessage("Microsoft.Usage", "CA2240:ImplementISerializableCorrectly")]
public class TreeNode : MarshalByRefObject, ICloneable, ISerializable {

    object userData;

    protected virtual void Serialize(SerializationInfo si, StreamingContext context) {

        // SNIP storage of irrelevant fields.

        if (userData != null && userData.GetType().IsSerializable) {
            si.AddValue("UserData", userData, userData.GetType());
        }
    }

    public object Tag {
        get {
            return userData;
        }
        set {
            userData = value;
        }
    }
 }

请注意,如果您的Tag对象可序列化,则会以静默方式跳过该对象;不会抛出异常。

答案 1 :(得分:0)

我想改进这个答案。

在课前使用class Ferrari extends controller { public function action_testarossa() { // whatever you'd like to do echo $this->request->param('model_year'); } } 并且该课程来自[Serializable()]非常重要。

此外,可以接受来自反序列化 ISerializable函数的参数的重载构造函数的存在非常重要。

本质上,GetObjectData函数提供了序列化程序以字符串形式访问所有信息的能力,而重载的GetObjectData构造函数可以重新解释该序列化的字符串数据并将其加载回对象

我必须以下列方式构建我的类(这是半伪代码):

NodeTag