【问题标题】:Can protobuf-net deserialize protected/friend fields in Silverlight?protobuf-net 可以反序列化 Silverlight 中的受保护/朋友字段吗?
【发布时间】:2011-12-20 15:15:00
【问题描述】:

在将 Silverlight 与 WCF 结合使用时,我一直在努力解决复杂的对象层次结构,以便在整个网络中传递。我已经尝试过 DataContractSerializer,主要问题是我正在尝试使用具有多个循环引用的 Dictionary,但无法使其正常工作。

我已经转而查看 protobuf-net,认为无论如何使用二进制格式可能会更好。我希望能够进行大量查找和替换以将 ProtoMember 属性添加到属性中。然而,许多使用 DataMember 属性序列化的属性被声明为 Friend (vb.net)。我发现 protobuf-net 在反序列化时会抛出错误,说

Attempt by method <blah> to access field <fieldname> failed.

我发现将字段设置为受保护会导致相同的错误,解决此问题的唯一方法是将字段设置为公开 - 这是我不想做的事情。是否可以在字段支持的属性上使用受保护的 setter 或类似方法来执行此操作?虽然这会很痛苦(许多字段/属性和类),但至少可以解决问题。后端的序列化工作正常。

如果这是不可能的,任何人都可以建议我如何获得一个复杂的对象层次结构,其中循环引用包括完整形式的多个字典?我意识到 Silverlight 为这个过程增加了一些限制,但希望有人已经成功了。

注意这是 Silverlight 5

【问题讨论】:

    标签: silverlight serialization protobuf-net silverlight-5.0


    【解决方案1】:

    在 Silverlight 中:不;运行时有更高级别的偏执狂,你只是无法触及其他类型的非公共部分。甚至Silverlight DataContractSerializer page 也有警告:

    您可以序列化字段和属性,前提是它们可以公开访问。

    我的理解是,这在 Silverlight 上是无法避免的。

    【讨论】:

    • 感谢 Marc 的快速响应,这可能是我从一开始就缺少的。所以为了完全清楚,我能够在 .Net 中序列化某些内容并在 Silverlight 中反序列化它的唯一方法 - 无论是使用 protobuff-net、DataContractSerializer 还是其他序列化器 - 而无需编写大量自定义 Onserialize/OnDeserialize 类型代码是如果每个属性都有一个公共的 Setter(或者如果它是一个字段而不是一个属性,那么它就是公共的)。谢谢。
    • 另外,Marc,我注意到您链接到的同一页面上的注释如下:“您可以将 DataMemberAttribute 应用于私有成员和公共成员。”嗯。更令人困惑的是,底部有一条评论:“即使文档说你可以使用 Silverlight 3.0,你也不能序列化私有变量 :( ”这与你引用的行不冲突吗?
    • @hitch 可能,但它们都来自同一个 MSDN 页面 - 所以请使用 MSDN ;p 当然,虽然您确实可以将属性 应用 到两个公共/private 成员,尚不清楚它是否会在两者上工作 ;p 这可能是分裂的头发,但上次我检查 SL 上的 DataContractSerializer 只是公开的。 可能发生了变化(如果有的话,我会很感兴趣)。
    • 再次感谢 Marc - 遗憾的是,比起 MSDN,我更倾向于相信你。我可能会做一些大规模查找和替换以公开所有内容以进行测试,但看起来这可能是整体问题。
    • @hitch 你能不能在开始破解之前尝试使用[DataContract] public class Foo { [DataMember(Order=1)] public string Bar {get;set;} }
    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多