我在一个程序集中有一个基类,在另一个程序集中有大量生成的类,它们继承自基类。在尝试解析subclassType(SerializerT.cs的第248行)时,使用protobuf-net(r282)序列化基类型列表失败,因为子类不在基类的程序集中。将类放在一起并不是一个首选的选项,而且我可以传递List。
这是我标记的基类。包含的类型根据需要标记为ProtoMember(x)
。
[ProtoContract]
[ProtoInclude(1,"SomeItemType")]
[ProtoInclude(2,"AnotherItemType")]
[ProtoInclude(190,"YetAnotherItemType")]
public abstract class BaseItem
{
}
作为旁注,这是评估使用protobuf-net替换BinaryFormatter在桌面应用程序和SOAP Web服务之间移动数据的一部分。
我可以做这种事情吗?有没有更好的办法?我只是缺少一些明显的东西吗?一个单独的长期问题是我应该做些什么稍微不同的准备最终转向3.5?
答案 0 :(得分:1)
使用ProtoInclude
的最简单方法可能是使用typeof
,因为这会自动处理很多细微差别:
[ProtoInclude(1, typeof(SomeItemType))]
或者,您可以使用程序集限定名称,因此:
[ProtoInclude(1,"SomeItemType, SomeRandomAssembly")]
在涉及多个AppDomain
的一个相当特殊的情况下,我发现你也可以在AppDomain.TypeResolve
事件中运用一些魔法,但如果可能的话应该避免这种情况。我还在管道中对元数据层进行了彻底的重新处理,在运行时允许更多的灵活性(而不是在编译时声明everthing,这导致了上面的一些痛苦)。