我正在尝试序列化enum
装饰有的类型[Flags]
属性。这enum
声明如下:
[Flags]
[ProtoContract(EnumPassthru = true)]
public enum Categories
{
[ProtoEnum(Name = nameof(Invalid), Value = 0x0)]
Invalid = 0x0,
[ProtoEnum(Name = nameof(A), Value = 0x1)]
A = 0x1,
[ProtoEnum(Name = nameof(B), Value = 0x2)]
B = 0x2,
[ProtoEnum(Name = nameof(C), Value = 0x4)]
C = 0x4,
[ProtoEnum(Name = nameof(D), Value = 0x8)]
D = 0x8,
[ProtoEnum(Name = nameof(Global), Value = 0x1 | 0x2 | 0x4 | 0x8)]
Global = A | B | C | D,
}
现在,当我尝试序列化容器对象时,我得到
InvalidOperationException:由于对象的当前状态,操作无效。
继 SO 上的其他类似帖子之后,我尝试了以下操作:
- Add
EnumPassthru = true
我的枚举 ProtoContract 属性中的参数
- Use
RuntimeTypeModel.Default[typeof(Categories)].EnumPassthru = true;
在应用程序启动阶段,
- 使用 IsRequired 参数提供容器对象的枚举值字段
[ProtoMember(6, IsRequired = true)]
我的枚举声明还有什么遗漏的吗?
异常详细信息的开头如下所示:
InvalidOperationException:由于对象的当前状态,操作无效。\r\n 位于 c:\Users\onur.gumus\Desktop\protobuf-net-master\protobuf 中的 ProtoBuf.Serializers.EnumSerializer.EnumToWire(Object value) -net\Serializers\EnumSerializer.cs:line 83\r\n at ProtoBuf.Serializers.EnumSerializer.Write(Object value, ProtoWriter dest) in c:\Users\onur.gumus\Desktop\protobuf-net-master\protobuf- net\Serializers\EnumSerializer.cs:第 125 行\r\n 位于 c:\Users\onur.gumus\Desktop\protobuf-net-master\protobuf-net 中的 ProtoBuf.Serializers.FieldDecorator.Write(Object value, ProtoWriter dest) \Serializers\FieldDecorator.cs:第 38 行\r\n 位于 c:\Users\onur.gumus\Desktop\protobuf-net-master\protobuf-net\ 中的 ProtoBuf.Serializers.TypeSerializer.Write(Object value, ProtoWriter dest) Serializers\TypeSerializer.cs:第 173 行\r\n 位于 c:\Users\onur.gumus\Desktop 中的 ProtoBuf.Meta.TypeModel.TrySerializeAuxiliaryType(ProtoWriter writer、类型类型、DataFormat 格式、Int32 标记、对象值、布尔值 isInsideList) \protobuf-net-master\protobuf-net\Meta\TypeModel.cs:第 125 行 ...
在所有容易获得的(即不是古老的)版本的 protobuf-net 中,[Flags]
将激活传递行为,使其正常工作。[ProtoContract(EnumPassThru = true)]
will also激活直通行为,但如果[Flags]
已指定。
在 2.3.0 及更高版本中,直通行为也是默认假设只要你没有[ProtoEnum]
属性实际上改变序列化值(其中:你的没有) - 这是为了与“proto3”更加一致,并且使得在绝大多数情况下更容易使用枚举。
所以:没有必要这样做anything在这里 - 你的代码应该已经可以工作了。
我已经尝试过你的代码:
- 2.3.0 和 2.0.0.668
- 具有问题中的属性,以及除
[Flags]
removed
- 在 2.3.0 上甚至
[Flags]
属性已删除(尽管我同意在您的情况下应该保留它 - 这绝对是一个[Flags]
enum)
- 以枚举作为根值,并以枚举作为标记的成员
[ProtoMember]
在传入的对象上
在所有情况下它都工作得很好。所以:在一般情况下,我只能说,你所拥有的应该已经可以工作了.
如果它失败了specific在这种情况下,最好在问题中包含完整的可运行示例(理想情况下准确地告诉我们您正在运行的框架),以便我们可以看到您所看到的内容。这工作得很好,例如:
using ProtoBuf;
using System;
[Flags]
public enum Categories
{
Invalid = 0x0,
A = 0x1,
B = 0x2,
C = 0x4,
D = 0x8,
Global = A | B | C | D,
}
[ProtoContract]
public class X
{
[ProtoMember(1)]
public Categories Val { get; set; }
public override string ToString() => Val.ToString();
}
static class P
{
static void Main()
{
var orig = new X { Val = Categories.D | Categories.B };
var cloneObj = Serializer.DeepClone(orig);
Console.WriteLine(cloneObj);
var cloneEnum = Serializer.DeepClone(orig.Val);
Console.WriteLine(cloneEnum);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)