C#中的设计时序列化
我在C中创建了一个非可视组件,该组件被设计为表单上元数据的占位符。
该组件具有一个属性,该属性是自定义对象的集合,该对象被标记为Serializable,并实现用于序列化的GetObjectData和用于反序列化的公共构造函数。
在该表单的resx文件中,它将生成用于存储集合的二进制数据,但是,每当我对序列化类进行更改时,都会遇到设计器错误,需要从resx文件中手动删除数据,然后重新创建此数据。
我尝试过更改构造函数,使其在类中的每个属性周围都有一个try / catch块
try { _Name = info.GetString("Name"); } catch (SerializationException) { this._Name = string.Empty; }
但它仍然崩溃。我得到的最后一个错误是我必须实现IConvertible。
我更喜欢使用xml序列化,因为我至少可以看到它,这可能吗
供设计师使用?
有没有办法使序列化更稳定并且对更改的抵抗力更小?
编辑:
更多信息...更好的描述
我有一个从Component继承的类,它有一个属性,它是一组Rules。 RulesCollection似乎必须标记为Serializable,否则它不会保留其成员。
Rules类也是具有属性DesignTimeVisible(false)的Component,以使其停止在组件托盘中显示,该类未标记为Serializable。
将集合标记为Serializable会在resx文件中生成二进制数据(不理想),并且IDE报告Rule类不可序列化。
我认为这个问题已经超越了一个简单的问题。因此,我可能会在短期内关闭它。
如果有人对相似的东西有任何链接,那将会有很大帮助。
解决方案
我们可能想尝试另一种方法,使所有内容都可以序列化为生成的代码。做到这一点非常容易。只需从Component实现非可视类。然后按原样公开集合,但确保放置到集合中的每个对象本身都是从Component派生的。通过这样做,一切都是代码生成的。
我们是否可以在存在序列化问题的类中添加更多代码,也许是构造函数和属性来引用正在使用的变量。
请注意:
我在视觉设计器和代码生成方面遇到很多问题,如果我在控件上有一个属性,那么通常我会把
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
在属性上,自己处理初始化。
从那以后,我发现我要去哪里错了。
我正在实现自定义集合(从CollectionBase继承)的组件,将其更改为List,并将DesignerSerializationVisibility(DesignerSerializationVisibility.Content)属性添加到List属性,该列表也是只读的。然后,这将产生代码以生成所有组件属性和列表中的所有条目。
列表中存储的类不需要任何特殊的属性或者需要可序列化。
private List<Rule> _Rules; [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public List<Rule> Rules { get { return _Rules; } }