小编Lon*_*ter的帖子

使用方法:1.使用Serializer.Merge/Serialize&2进行ISerializable,使用RuntimeTypeModel.Default进行ProtoInclude?

我翻译我的项目使用protobuf-net而不是BinaryFormatter.它看起来像有一个缺少文档http://code.google.com/p/protobuf-net/w/list 我也查阅了一些例子,从http://code.google.com/p/protobuf-net/source/browse / 但有些事情对我来说仍然不明确,这就是我决定在这里问的原因:

1.关于ISerializable和Serializer.Merge/Serialize

如果我们从ISerializable继承以进行特定的序列化.正如我读到的:ProtoBuf-Net ProtoInclude Generic Type Subclass 我们必须使用一个钩子Serializer.Merge/Serialize;

假设我们有课:

[Serializable]
[ProtoContract]
public class Anchor : ISerializable
{       
    [ProtoMember(1)]
    public int id;

    [ProtoMember(2)]
    public Ship ship;
    ...
 }
Run Code Online (Sandbox Code Playgroud)

Serializer.Merge(信息,这一点); 必须添加到构造函数Anchor(SerializationInfo info,StreamingContext context)

Serializer.Serialize(info,this); 添加到void GetObjectData(SerializationInfo info,StreamingContext context)

所以,我们有:

    protected Anchor(SerializationInfo info, StreamingContext context)
    {
        //for binaryformatter:            
        Type myType = typeof(Anchor);
        foreach (SerializationEntry e in info)
        {
            FieldInfo f = myType.GetField(e.Name,BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Public|BindingFlags.Instance);
            f.SetValue(this,e.Value);
        }

        //added for protobuf-net:
        Serializer.Merge(info, this);
   }

    public virtual void …
Run Code Online (Sandbox Code Playgroud)

inheritance serialization protocol-buffers protobuf-net iserializable

2
推荐指数
1
解决办法
1083
查看次数