protobuf-net 跨程序集边界的序列化和反序列化

4

我有一个基类在一个程序集中,还有一个大量从该基类继承的生成类在另一个程序集中。当使用protobuf-net (r282)对基类型的列表进行序列化时,尝试解析子类类型(SerializerT.cs的第248行)会失败,因为子类不在基类所在的程序集中。将这些类一起移动并不是首选的选项,重要的是我可以传递List。

这里是我的标记基类。包含的类型都用ProtoMember(x)标记为必需。

[ProtoContract] 
[ProtoInclude(1,"SomeItemType")]
[ProtoInclude(2,"AnotherItemType")]
[ProtoInclude(190,"YetAnotherItemType")]
public abstract class BaseItem
{
}

作为一个附注,这是评估使用protobuf-net代替BinaryFormatter在桌面应用程序和SOAP Web服务之间传输数据的一部分。
我能做到这种事吗?有更好的方法吗?我是否错过了一些明显的东西?另一个长期问题是,我是否应该做一些稍微不同的准备,以便最终转移到3.5?
1个回答

1
也许使用typeof是使用ProtoInclude最简单的方法,因为它可以自动处理很多细节。
[ProtoInclude(1, typeof(SomeItemType))]

或者您可以直接使用程序集限定名称,例如:

[ProtoInclude(1,"SomeItemType, SomeRandomAssembly")]

在涉及多个AppDomain的相当奇特的情况下,我发现您还可以通过AppDomain.TypeResolve事件进行一些魔法操作,但如果可能的话应该避免使用。我还在管道中完全重新设计了元数据层,允许更多的运行时灵活性(而不是必须在编译时声明所有内容,这导致了上述某些痛苦)。

谢谢Marc,这正是我要找的。使用完整的程序集限定名称解决了问题。由于我的SomeItemType在基类中不可用,所以在这种情况下typeof(SomeItemType)是行不通的。再次感谢。 - tsupe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接