C#MongoDB尝试将enum:uint32转换为int32并崩溃

时间:2017-12-12 20:31:15

标签: c# mongodb enums

我有一个枚举

public enum MyEnum : uint
    {
        ValueA = 1233104067,
        ValueB= 1119849093,
        ValueC= 2726580491
}

每当我使用此枚举创建一个类并尝试将其存储到数据库中时。  例如

class MyClass {
    public MyEnum newValue = MyEnum.ValueC;
}

这会使程序崩溃

Unhandled Exception: System.OverflowException: Value was either too large or too small for an Int32.
   at System.Convert.ThrowInt32OverflowException()
   at System.UInt32.System.IConvertible.ToInt32(IFormatProvider provider)
   at MongoDB.Bson.Serialization.Serializers.EnumSerializer`1.Serialize(BsonSerializationContext context, BsonSerializationArgs args, TEnum value)

它尝试将uint值转换为int,但它们太大而且会抛出异常。

如何解决此问题?

感谢。

1 个答案:

答案 0 :(得分:1)

MongoDB将数据存储为BSON,doesn't have unsigned integer types

您有三种选择:

  1. 注释您的未签名类型。

    如果使用驱动程序v2.4.3或更早版本:

    apiClient.setBasePath('www.docusign.net/restapi');
    apiClient.addDefaultHeader('Authorization', 'Bearer ' + token);
    
    docusign.Configuration.default.setDefaultApiClient(apiClient);
    const authApi = new docusign.AuthenticationApi();
    const loginOps = {
        apiPassword: true,
        includeAccountIdGuid: true
    };
    
    authApi.login(loginOps, function (err, loginInfo, response) {
        if (err) {
            console.log(err);
        }
        if (loginInfo) {
    
            // loginInfo returns 'exports {}' so the variables below cannot be set.
    
            const loginAccounts = loginInfo.loginAccounts;
            const loginAccount = loginAccounts[0];
            const baseUrl = loginAccount.baseUrl;
            const accountDomain = baseUrl.split('/v2');
            const accountId = loginAccount.accountId;
    
            apiClient.setBasePath(accountDomain[0]);
            docusign.Configuration.default.setDefaultApiClient(apiClient);
    

    不幸的是,驱动程序v2.4.4及更高版本中的序列化程序并不重要 public class MyClass { [BsonRepresentation(BsonType.Int32, AllowOverflow = true)] public MyEnum Value1 = MyEnum.ValueC; [BsonRepresentation(BsonType.Int32, AllowOverflow = true)] public uint Value2 = uint.MaxValue; } ,无论如何都要抛出异常(测试和 确认,感谢dnickless指出这一点)。这是一个解决方法 (以牺牲一些浪费的空间为代价):

    AllowOverflow
  2. 使用签名类型并在适当的时候进行转换。

    public class MyClass
    {
        [BsonRepresentation(BsonType.Int64)]
        public MyEnum Value1 = MyEnum.ValueC;
    
        [BsonRepresentation(BsonType.Int64)]
        public uint Value2 = uint.MaxValue;
    }
    
  3. 手动序列化(UInt32SerializerUInt64Serializer等)。