我有一个非常简单的类,我正在尝试序列化:
[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:
at System.Reflection.RuntimeFieldInfo.GetValue(Object obj) 在ProtoBuf.Serializers.FieldDecorator.Write(对象值,ProtoWriter dest) 在ProtoBuf.Serializers.TypeSerializer.Write(Object value,ProtoWriter dest) 在ProtoBuf.Meta.RuntimeTypeModel.Serialize(Int32 key,Object value,ProtoWriter dest) 在ProtoBuf.Meta.TypeModel.SerializeCore(ProtoWriter writer,Object value) 在ProtoBuf.Meta.TypeModel.Serialize(Stream dest,Object value,SerializationContext context) 在ProtoBuf.Meta.TypeModel.Serialize(Stream dest,Object value) 在ProtoBuf.Serializer.Serialize [T](Stream destination,SettingStore实例)
在反序列化时,我得到了equivelant异常。
如果我公开两个词典,一切正常,但完全打破了我的对象结构。我正在使用v2 r431发行版。完全相同的代码在.NET 4.0中运行良好。
谢谢!
答案 0 :(得分:3)
在WP7中,通过反射访问非公共成员仅限于其定义的程序集。它是一种旨在阻止访问内部电话API的安全功能。
您的_IntVals
成员是私有的,因此原始缓冲区程序集无法访问。