我遇到以下情况:我对对象进行了序列化:MyBOContainer
。
它引发了序列化错误“类MyUIElement
未标记为可序列化”。
通常,我不应该在myBOContainer
元素(或他们的孩子)之间有这样的类。
但是,我有一些公开List<object>
,理论上这是可能的。
问题:
如果对象myBOContainer
的实例包含(deepsearch)或不包含MyQueryTestClass
类型的实例,我如何在VS中的调试模式下进行测试?
答案 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>
。