Enums二进制序列化为数字还是文本 - 我想重命名它们

时间:2015-10-21 09:37:08

标签: c# enums binary-serialization

Enums二进制序列化为数字还是文本 - 我想重命名它们。

示例:

[Flags]
public enum VerticalAlignment : byte
{
    None = 0,
    Centered = 1,
    Top = 2,
    Bottom = 4,
    Stretch = 8,
    All = Centered | Top | Bottom | Stretch
}

3 个答案:

答案 0 :(得分:3)

这取决于您使用的序列化程序。

以下是使用DataContractSerializer

的代码
var serializer = new DataContractSerializer(typeof (VerticalAlignment));

var alignment = VerticalAlignment.Centered;

using (var stream = File.Create("serialize.txt"))
{
    serializer.WriteObject(stream, alignment);
    stream.Close();
}

这会将数据序列化为XML,它使用枚举的名称而不是值。 " serialize.txt"的内容文件如下:

<Program.VerticalAlignment xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication2">Centered</Program.VerticalAlignment>

如果要进行二进制序列化,可以使用BinaryFormatter类:

var serializer = new BinaryFormatter();

var alignment = VerticalAlignment.Centered;

using (var stream = File.Create("serialize.txt"))
{
    serializer.Serialize(stream, alignment);
    stream.Close();
}

这会将以下内容写入序列化文件:

Binary serialization

要测试是否使用了名称或值,我们可以重命名该字段,并查看写入文件的内容是否不同。首先,我们重命名枚举字段:

[Flags]
public enum VerticalAlignment : byte
{
    None = 0,
    CenteredDummy = 1,
    Top = 2,
    Bottom = 4,
    Stretch = 8,
    All = CenteredDummy | Top | Bottom | Stretch
}

现在,如果我们检查写入文件的数据,我们可以看到内容是相同的:

Binary serialization

因此我们现在确定使用了枚举值而不是密钥。

答案 1 :(得分:2)

我相信该字节用于序列化枚举。 快速示例:

public static void Main()
{
    VerticalAlignment some  = VerticalAlignment.All;

    BinaryFormatter bf = new BinaryFormatter();
    using (var writer = File.Create("SomeText.bin"))
    {
        bf.Serialize(writer, some);
    }
}

来自档案的转储:

dump ........

我确信0f(前一对之前的那个)表示枚举的值:

1 | 2 | 4 | 8 = 15 (dec) = f (hex)

答案 2 :(得分:0)

借用nopeflows示例,我们可以确认它实际上只是字节的序列化,而不是名称。

首先将其序列化为字符串,如nopeflow的示例代码所示。 接下来重命名&#34; All&#34;枚举成员&#34; AllNew&#34;然后反序列化它,你会看到反序列化的枚举的值是&#34; AllNew&#34;,证明字节值是序列化的。

VerticalAlignment some = VerticalAlignment.Bottom;

BinaryFormatter bf = new BinaryFormatter();
using (var reader = File.Open("SomeText.bin", FileMode.Open))
{
    some = (VerticalAlignment)bf.Deserialize(reader);
}