枚举转换/序列化

时间:2016-07-26 07:52:17

标签: c# serialization enums

我正在编写一个序列化程序类,我正在尝试编写一个能够序列化任何枚举的函数(可以由int,byte,ulong ...支持)。这会按我想要的方式工作吗?有没有更好的方法呢?

public bool Serialize<TEnum>(ref TEnum data, TEnum min, TEnum max) where TEnum : struct, IComparable, IFormattable, IConvertible
{
    if (!typeof(TEnum).IsEnum)
    {
        throw new ArgumentException("arguments must be an Enum");
    }

    Type eType = Enum.GetUnderlyingType(data.GetType());

    if (eType == typeof(byte) || eType == typeof(ushort) || eType == typeof(uint) || eType == typeof(ulong))
    {
        var data2 = (ulong) Convert.ChangeType(data, eType);
        var min2 = (ulong) Convert.ChangeType(min, eType);
        var max2 = (ulong) Convert.ChangeType(max, eType);

        if (IsReading)
        {
            bool success = bs.Read(out data2, min2, max2);
            data = (TEnum) Convert.ChangeType(data2, typeof(TEnum));
            return success;
        }
        bs.Write(data2, min2, max2);
    }
    else
    {
        var data2 = (long) Convert.ChangeType(data, eType);
        var min2 = (long) Convert.ChangeType(min, eType);
        var max2 = (long) Convert.ChangeType(max, eType);

        if (IsReading)
        {
            bool success = bs.Read(out data2, min2, max2);
            data = (TEnum) Convert.ChangeType(data2, typeof(TEnum));
            return success;
        }
        bs.Write(data2, min2, max2);
    }
    return true;
}

1 个答案:

答案 0 :(得分:0)

要将longulong转换为由较小类型的整数支持的enum,您需要使用Enum.ToObject()。如果基础数字类型没有相同的字节数,Convert.ChangeType()将抛出异常。 IConvertible.ToInt64()IConvertible.ToUInt64()会比Convert.ChangeType()略快,因为后者实际上会调用前者。

除此之外,以下内容应该可以将enum作为8个字节序列化为序列化流。对于非long枚举,这将比将其序列化为基础数字类型的空间效率更低,但具有允许随后更改基础数值类型的优势(例如,从int到{ {1}}以容纳额外的long值而不会使旧的序列化流无效:

[Flags]

示例fiddle