Visual Studio:检测容器中的类型存在

时间:2010-12-03 10:16:12

标签: .net visual-studio debugging

我遇到以下情况:我对对象进行了序列化:MyBOContainer

它引发了序列化错误“类MyUIElement未标记为可序列化”。

通常,我不应该在myBOContainer元素(或他们的孩子)之间有这样的类。 但是,我有一些公开List<object>,理论上这是可能的。

问题:
如果对象myBOContainer的实例包含(deepsearch)或不包含MyQueryTestClass类型的实例,我如何在VS中的调试模式下进行测试?

3 个答案:

答案 0 :(得分:1)

如果您无法预测数据是什么,那么IMO就不应该序列化该元素。

由于您使用的是BinaryFormatter,因此可能会添加一些[NonSerialized]

[NonSerialized]
private List<object> foo = ...

此外,事件是导致混淆的常见原因;我也会注释任何事件:

[field:NonSerialized]
public event EventHandler SomeCrazyEvent;

或者如果您正在进行显式事件实现,请在持有[NonSerialized]delegate的任何支持字段上设置EventHandlerList

(好吧,严格来说我首先不会使用BinaryFormatter - 使用与内部类结构无关的序列化只能是好事;但那是另一天的咆哮...)

答案 1 :(得分:0)

因此,有效的解决方案是激活.NET Framework代码调试模式。 然后,从异常堆栈跟踪中找到抛出异常的函数并逐步调试。

确定抛出异常的那一刻我发现在BO类中引入UserControls的“外星人”是UserControl使用的Event。

解决方案 - 将此活动设为[NonSerialized]

答案 2 :(得分:0)

  

如何在VS中的调试模式下进行测试   如果是对象myBOContainer的实例   包含(deepsearch)或不包含实例   MyQueryTestClass类型?

以下是一些完成此操作的C#代码:

if (myBOContainer.OfType<MyQueryTestClass>().Any())
{
    // the container contains an item of type MyQueryTestClass
}

因此,如果您有List<object>,则要么不要序列化它(使用NonSerializedAttribute,就像其他人说的那样),或者只是删除不可序列化的项目。

myList.RemoveAll(myList.OfType<MyNonSerializableClass>());

或者使用反射来查看哪个项目可序列化。

我推荐的解决方案

从未使用List<object>来存储随机对象。这通常是由于忽略强类型而导致的,强类型语言在强类型语言中总是很糟糕。请改用List<SomeSpecificType>