我有一个带有标志的枚举,我用序列化的 [ProtoMember] 属性装饰并反序列化在我运行 Win7 x64 的本地机器上很好。
但是,我的用例涉及在运行 Windows Server 2008 R2 Enterprise 64 位的服务器上序列化并在我的本地机器上反序列化。当我反序列化时,出现异常:“溢出异常未处理;算术运算导致溢出”。它似乎是从 ProtoBuf.Serializers.CompiledSerializer.ProtoBuf.Serializers.IProtoSerializer.Read(Object value, ProtoReader source) 抛出的。
我尝试将枚举更改为 int 并序列化在服务器上/反序列化本地工作。我想使用枚举而不是int。我究竟做错了什么?
不确定这是否是相关信息,但我在服务器上运行的可执行文件是在我的本地机器上构建的。
枚举来自引用的外部 dll。当我在我的解决方案中复制枚举代码时,反序列化工作。仅当我使用来自外部 dll 的枚举(我怀疑源代码未知)并且枚举值大于(似乎)128 时才会引发异常。在我的情况下,Status.Zeta 和 Status。全部抛出异常;其他枚举值正确反序列化。枚举定义如下:
[Flags]
public enum Status
{
None = 0,
Alpha = 1,
Beta = 8,
Gamma = 16,
Delta = 32,
Epsilon = 64,
Zeta = 132,
All = 255,
}
我无法更改 dll 中的代码。我怎样才能使这项工作?我需要一个 .proto 文件吗?如果可能的话,我会尽量避免这种情况。