Enums二进制序列化为数字还是文本 - 我想重命名它们。
示例:
[Flags]
public enum VerticalAlignment : byte
{
None = 0,
Centered = 1,
Top = 2,
Bottom = 4,
Stretch = 8,
All = Centered | Top | Bottom | Stretch
}
答案 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();
}
这会将以下内容写入序列化文件:
要测试是否使用了名称或值,我们可以重命名该字段,并查看写入文件的内容是否不同。首先,我们重命名枚举字段:
[Flags]
public enum VerticalAlignment : byte
{
None = 0,
CenteredDummy = 1,
Top = 2,
Bottom = 4,
Stretch = 8,
All = CenteredDummy | Top | Bottom | Stretch
}
现在,如果我们检查写入文件的数据,我们可以看到内容是相同的:
因此我们现在确定使用了枚举值而不是密钥。
答案 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);
}
}
来自档案的转储:
我确信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);
}