为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
陪伴而非守候 2022-10-23 15:58:36
如果 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 }有什么办法可以使以后的版本以与早期版本相同的方式进行序列化?
查看完整描述

1 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

这是……意料之外的。我还不明白这里发生了什么,但你说得对,发生了变化。从历史上看,1使用 时枚举值存在偏移量InferTagFromNameDefault,并且“枚举 passthru”检查无法解释这一点(“enum passthru”现在评估到true这里,它本来应该是false以前的位置)。

以下似乎在运行时解决了这个问题:

RuntimeTypeModel.Default.Add(typeof(MyEnum), true).EnumPassthru = false;

或通过属性:

[ProtoContract(EnumPassthru = false)]
public enum MyEnum
{...}

我会调查这里发生的事情。


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号