【问题标题】:protobuf-net [de]serializing across assembly boundariesprotobuf-net [反] 跨程序集边界的序列化
【发布时间】:2010-02-16 20:29:40
【问题描述】:

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

【问题讨论】:

    标签: c# serialization protobuf-net


    【解决方案1】:

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

    [ProtoInclude(1, typeof(SomeItemType))]
    

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

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

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

    【讨论】:

    • 谢谢 Marc,正是我想要的。使用完整的程序集限定名称就可以了。由于我的 SomeItemType 在基类中不可用,因此 typeof(SomeItemType) 在这种情况下不可用。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2014-12-30
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多