版本中更改了 Protobuf-net 枚举序列化行为。2.3.0

如果 2.3.0 之前的任何序列化对象包含枚举值并且使用带有 InferTagFromNameDefault 而不是 ProtoMember 的 DataMember,则不会在 2.3.0 或更高版本中正确反序列化。


[DataContract]

public class ClassWithEnum

{

    [DataMember]

    public MyEnum Enum { get; set; }

}


public enum MyEnum

{

    FirstValue,

    SecondValue

}

我有这堂课。使用此代码对其进行序列化。


{

    RuntimeTypeModel.Default.InferTagFromNameDefault = true;


    var v = new ClassWithEnum { Enum = MyEnum.SecondValue };


    using (var memoryStream = new MemoryStream())

    {

       Serializer.Serialize(memoryStream, v);

       var bytes = memoryStream.ToArray();

    }

}

在 2.3.0 之前,这将导致 byte[] { 8, 2 },而在 2.3.0 之后,这将导致 byte [] { 8, 1 }


有什么办法可以使以后的版本以与早期版本相同的方式进行序列化?


陪伴而非守候
浏览 139回答 1
1回答

慕桂英546537

这是……意料之外的。我还不明白这里发生了什么,但你说得对,发生了变化。从历史上看,1使用 时枚举值存在偏移量InferTagFromNameDefault,并且“枚举 passthru”检查无法解释这一点(“enum passthru”现在评估到true这里,它本来应该是false以前的位置)。以下似乎在运行时解决了这个问题:RuntimeTypeModel.Default.Add(typeof(MyEnum), true).EnumPassthru = false;或通过属性:[ProtoContract(EnumPassthru = false)] public enum MyEnum {...}我会调查这里发生的事情。
打开App,查看更多内容
随时随地看视频慕课网APP