【问题标题】:Protobuf-net in WP7 throws FieldAccessExceptionsWP7 中的 Protobuf-net 抛出 FieldAccessExceptions
【发布时间】:2012-01-24 02:48:54
【问题描述】:

我有一个非常简单的类,我正在尝试序列化:

    [ProtoContract]
public class SettingStore {
    public event EventHandler ContentsChanged;

    [ProtoMember(1)]
    private Dictionary<string, string> _StringVals = new Dictionary<string, string>(50);

    [ProtoMember(2)]
    private Dictionary<string, int> _IntVals = new Dictionary<string, int>(50);

    public SettingStore() {
    }

    //Bunch of accessors omited

    public static SettingStore DeSerialize(Stream data) {
        return Serializer.Deserialize<SettingStore>(data);
    }

    public void Serialize(Stream Target) {
        Serializer.Serialize<SettingStore>(Target, this);
    }
}

在序列化时,我得到一个带有以下堆栈跟踪的 FieldAccessException:

在 System.Reflection.RuntimeFieldInfo.GetValue(Object obj) 在 ProtoBuf.Serializers.FieldDecorator.Write(对象值,ProtoWriter dest) 在 ProtoBuf.Serializers.TypeSerializer.Write(对象值,ProtoWriter dest) 在 ProtoBuf.Meta.RuntimeTypeModel.Serialize(Int32 键,对象值,ProtoWriter 目标) 在 ProtoBuf.Meta.TypeModel.SerializeCore(ProtoWriter 编写器,对象值) 在 ProtoBuf.Meta.TypeModel.Serialize(流目标,对象值,SerializationContext 上下文) 在 ProtoBuf.Meta.TypeModel.Serialize(流目标,对象值) 在 ProtoBuf.Serializer.Serialize[T](Stream destination, SettingStore 实例)

在反序列化时,我得到了等价的异常。

如果我公开这两个字典,一切正常,但完全破坏了我的对象结构。我正在使用 v2 r431 发行版。相同的代码在 .NET 4.0 中也能正常工作。

谢谢!

【问题讨论】:

    标签: c# windows-phone-7 protocol-buffers protobuf-net


    【解决方案1】:

    在 WP7 中,通过反射访问非公共成员仅限于定义它的程序集。这是一项旨在防止访问内部电话 API 的安全功能。

    您的 _IntVals 成员是私有的,因此不能被 proto-buffers 程序集访问。

    【讨论】:

    • 啊,这当然是完全有道理的。然而,这似乎打破了 protobuf-net 的属性驱动模式创建。我想为了保持封装,我会做一些简单的 DTO,然后对其进行序列化/反序列化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多