4

我在一个程序集中有一个基类,在另一个程序集中有大量从基类继承的生成类。尝试解析 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 做准备?

4

1 回答 1

1

也许最简单的使用方法ProtoInclude是 with typeof,因为它会自动为您处理很多细微差别:

[ProtoInclude(1, typeof(SomeItemType))]

或者,您可以只使用程序集限定名称,因此:

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

在涉及多个AppDomains 的相当特殊的情况下,我发现您还可以对AppDomain.TypeResolve事件进行一些魔术,但如果可能的话应该避免这种情况。我还对管道中的元数据层进行了完整的重新设计,从而在运行时提供了更大的灵活性(而不是必须在编译时声明所有内容,这会导致上述一些痛苦)。

于 2010-02-16T22:20:51.740 回答