C#中的设计时序列化

时间:2020-03-06 14:57:24  来源:igfitidea点击:

我在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; }
}