是枚舉二進制序列化爲數字或文本 - 我想重命名它們。是枚舉二進制序列化爲數字或文本 - 我想重命名它們
實施例:
[Flags]
public enum VerticalAlignment : byte
{
None = 0,
Centered = 1,
Top = 2,
Bottom = 4,
Stretch = 8,
All = Centered | Top | Bottom | Stretch
}
是枚舉二進制序列化爲數字或文本 - 我想重命名它們。是枚舉二進制序列化爲數字或文本 - 我想重命名它們
實施例:
[Flags]
public enum VerticalAlignment : byte
{
None = 0,
Centered = 1,
Top = 2,
Bottom = 4,
Stretch = 8,
All = Centered | Top | Bottom | Stretch
}
它取決於您使用的序列化程序。
下面是使用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
}
現在,如果我們考察的是被寫入文件中的數據,我們可以看到的內容都是一樣的:
我們因此現在知道使用枚舉值而不是密鑰。
借用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);
}
我認爲'byte'用於序列化enum。 – pwas
@PatrickHofman枚舉是它們所基於的任何數字類型,如果沒有指定,則默認爲「int」。這個問題是'byte'。 –