OK, another rant on why I can’t stand the way VB.Net does things differently from the way C# does them (and usually for some sort of backward compatibility to VB6). This time the weirdness came by way of trying to using binary serialization on a class that listens to events on a class that isn’t marked serializable. Recently another developer on my team add events to a class that is marked serializable, and then added listeners to the UI class by marking the class with the WithEvents attribute. He then added event handlers by way of the handles attribute on the sub. The problem is that since VB.Net uses hidden multicast delegate fields when you use this VB-centric method of handling events, the binary serializer will try to serialize the UI class listening in on the events. Prior to adding this bit of code, binary serialization worked fine. Now with the new code, binary serialization fails with an error saying that the UI class isn’t marked serializable. So I had to search around trying to figure out what broke, and how to fix it.
Turns out the fix is pretty easy. Just don’t use the VB-centric style of event handling. Use AddHandlers instead of WithEvents and the Handles clause, and you avoid some of the serialization issues. Once I fixed it, then I could Google it and it looks like Trev Hunter ran into a similar issue, and wrote an article on it. I haven’t checked this out in .Net 2.0 beta 2, but I hope they fixed this issue.
I’m pulling this blog post. I put it together a little too quickly, and it is very hard to read, and some of the comments were just wrong. That’s what I get for jumping to conclusions, and not doing my usual thing, and creating the simplest project possible to test the bug I found. When I get some more time, I’ll post a sample app, with the issues I have (although they are not as bad as I first thought, there are differences between what you can do with VB.Net and C#).
The preceding blog entry has been syndicated from the DonXML Demsak’s All Things Techie Blog. Please post all comments on the original post.