7

我在 C# 中创建了一个非可视组件,它被设计为表单上元数据的占位符。
该组件有一个属性,它是自定义对象的集合,该对象被标记为可序列化,并实现了用于序列化的 GetObjectData 和用于反序列化的公共构造函数。

在表单的 resx 文件中,它将生成用于存储集合的二进制数据,但是每当我对序列化类进行更改时,我都会遇到设计器错误,需要从 resx 文件中手动删除数据,然后重新创建此数据。

我尝试更改构造函数以在类中的每个属性周围都有一个 try / catch 块

try
{
  _Name = info.GetString("Name");
}
catch (SerializationException)
{
  this._Name = string.Empty;
}

但它仍然崩溃。我得到的最后一个错误是我必须实现 IConvertible。

我更喜欢使用 xml 序列化,因为我至少可以看到它,设计师可以使用它吗?

有没有办法让序列化更稳定,对变化的抵抗力更小?

编辑:
更多信息...更好的描述也许
我有一个从组件继承的类,它有一个属性是规则的集合。RulesCollection 似乎必须标记为 Serializable,否则它不会保留其成员。

Rules 类也是一个组件,其属性为 DesignTimeVisible(false) 以阻止它显示在组件托盘中,该类未标记为 Serializable。

将集合标记为可序列化会在 resx 文件中生成二进制数据(不理想),并且 IDE 会报告规则类不可序列化。

我认为这个问题已经超出了一个简单的问题。所以我可能会很快关闭它。
如果有人有任何指向类似内容的链接,那将有很大帮助。

4

3 回答 3

3

您可能想尝试将所有内容序列化为生成代码的替代方法。要做到这一点非常容易。只需从Component实现您的非可视类。然后照原样公开您的集合,但确保放入集合中的每个对象本身都是从Component派生的。通过这样做,一切都是代码生成的。

于 2008-10-01T01:44:34.307 回答
3

从那以后,我发现了我哪里出错了。

我正在实现自定义集合的组件(从 CollectionBase 继承),我将其更改为 List 并将 DesignerSerializationVisibility(DesignerSerializationVisibility.Content) 属性添加到 List 属性,此列表也是只读的。这将生成代码以生成所有组件属性和列表中的所有条目。

存储在列表中的类不需要任何特定属性或需要可序列化。

private List<Rule> _Rules;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Rule> Rules
{
    get { return _Rules; }
}
于 2008-10-13T22:42:49.527 回答
2

您能否为存在序列化问题的类添加更多代码,也许是构造函数和属性以引用您正在使用的变量。

请注意:我在可视化设计器和代码生成方面遇到了很多问题,如果我在控件上有一个属性,那么通常我把

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

在属性上并自己处理初始化。

于 2008-10-02T01:00:53.043 回答