2011-09-10 32 views
3

我有我試圖序列化一個非常簡單的類:protobuf網在WP7拋出FieldAccessExceptions

[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:

在ProtoBuf.Meta的ProtoBuf.Serializers.TypeSerializer.Write(對象值,ProtoWriter dest) 處的ProtoBuf.Serializers.FieldDecorator.Write(對象值,ProtoWriter dest) 處的System.Reflection.RuntimeFieldInfo.GetValue(Object obj) 。 RuntimeType Model.Serialize(Int32 key,Object value,ProtoWriter dest) at ProtoBuf.Meta.TypeModel.SerializeCore(ProtoWriter writer,Object value) at ProtoBuf.Meta.TypeModel.Serialize(Stream dest,Object value,SerializationContext context) at ProtoBuf.Meta.TypeModel.Serialize(流DEST,對象的值) 在ProtoBuf.Serializer.Serialize [T](流的目的,SettingStore實例)

在反序列化,我得到了equivelant例外。

如果我公開兩個字典,一切正常,但完全打破了我的對象結構。我正在使用v2 r431發行版。在.NET 4.0中,相同的確切代碼工作得很好。

謝謝!

回答

3

在WP7,通過反射訪問非公共成員被限制爲它在限定的組件,它是設計用來防止訪問內部電話的API的安全特徵。

_IntVals構件是私有的,並且因此不能由原緩衝器組件的訪問。

+1

啊,當然這是總的感覺。但是,這似乎打破了protobuf-net的屬性驅動模式創建。我想這要保留封裝,我會做一些簡單的DTO,然後序列化/反序列化。 – tempy