我正在用C#编写一个程序,它将数据分配给一个类,然后将该类分配给treeview节点的Tag Value。
我可以使用我在此处找到的答案将我的treeview序列化为文件:Saving content of a treeview to a file and load it later。
但是,在反序列化文件时,使用此方法丢失了所有节点的标记,或者更可能的是,它们甚至不是首先被序列化。
使用此方法序列化时是否可以保留节点的Tag值?如果是这样,怎么样?
答案 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