枚举二进制序列化为数字还是文本 - 我想重命名它们
Are Enums binary serialized as numbers or as text - I want to rename them
枚举二进制序列化为数字还是文本 - 我想重命名它们。
示例:
[Flags]
public enum VerticalAlignment : byte
{
None = 0,
Centered = 1,
Top = 2,
Bottom = 4,
Stretch = 8,
All = Centered | Top | Bottom | Stretch
}
我相信字节是用来序列化枚举的。
快速示例:
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)
这取决于您使用的序列化程序。
这是使用 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
class:
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
}
现在,如果我们检查写入文件的数据,我们可以看到内容是相同的:
因此我们现在可以确定使用的是枚举值而不是密钥。
借用nopeflows样本,我们可以确认它实际上只是字节的序列化,而不是名称。
首先将其序列化为字符串,如nopeflow 的示例代码所示。
接下来将"All"枚举成员重命名为"AllNew",然后反序列化,可以看到反序列化后的Enum的值为"AllNew",证明字节值被序列化了
VerticalAlignment some = VerticalAlignment.Bottom;
BinaryFormatter bf = new BinaryFormatter();
using (var reader = File.Open("SomeText.bin", FileMode.Open))
{
some = (VerticalAlignment)bf.Deserialize(reader);
}
枚举二进制序列化为数字还是文本 - 我想重命名它们。
示例:
[Flags]
public enum VerticalAlignment : byte
{
None = 0,
Centered = 1,
Top = 2,
Bottom = 4,
Stretch = 8,
All = Centered | Top | Bottom | Stretch
}
我相信字节是用来序列化枚举的。 快速示例:
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)
这取决于您使用的序列化程序。
这是使用 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
class:
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
}
现在,如果我们检查写入文件的数据,我们可以看到内容是相同的:
因此我们现在可以确定使用的是枚举值而不是密钥。
借用nopeflows样本,我们可以确认它实际上只是字节的序列化,而不是名称。
首先将其序列化为字符串,如nopeflow 的示例代码所示。 接下来将"All"枚举成员重命名为"AllNew",然后反序列化,可以看到反序列化后的Enum的值为"AllNew",证明字节值被序列化了
VerticalAlignment some = VerticalAlignment.Bottom;
BinaryFormatter bf = new BinaryFormatter();
using (var reader = File.Open("SomeText.bin", FileMode.Open))
{
some = (VerticalAlignment)bf.Deserialize(reader);
}