2010-02-16 41 views
4

我在一个组件中的基类,并在另一从基类继承了大量生成的类。尝试解析子类类型(SerializerT.cs的第248行)时,使用protobuf-net(r282)序列化基类型列表失败,因为该子类不在基类的程序集中。将课程移到一起并不是首选,我可以在List中传递这一点很重要。protobuf网〔脱〕跨越组件边界序列化

这是我标记的基类。所包含的类型根据需要标记为ProtoMember(x)

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

作为边注,这是使用protobuf网以取代的BinaryFormatter为桌面应用和web服务的SOAP之间移动数据评估的一部分。

我可以做这种事吗?有没有更好的办法?我只是错过了一些明显的东西?另一个更长期的问题是,我应该做一些稍微不同的事情来准备最终迁移到3.5?

回答

1

也许使用ProtoInclude最简单的方法是用typeof,因为这会自动处理大量的细微差别你:

[ProtoInclude(1, typeof(SomeItemType))] 

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

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

在一个涉及多个AppDomain的相当特殊的案例中,我发现你也可以用AppDomain.TypeResolve事件做一些魔法,但是如果可能的话应该避免这种情况。我还有一个完整的流水线中的元数据层重新工作,在运行时允许更多的灵活性(而不必在编译时声明everthing,这导致了上面的一些痛苦)。

+0

谢谢马克,正是我所期待的。使用完整的装配限定名称的窍门。由于我的SomeItemType在基类中不可用,因此typeof(SomeItemType)在这种情况下不可行。再次感谢。 – tsupe 2010-02-17 14:31:21