2015-10-21 25 views
0

是枚舉二進制序列化爲數字或文本 - 我想重命名它們。是枚舉二進制序列化爲數字或文本 - 我想重命名它們

實施例:

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

我認爲'byte'用於序列化enum。 – pwas

+0

@PatrickHofman枚舉是它們所基於的任何數字類型,如果沒有指定,則默認爲「int」。這個問題是'byte'。 –

回答

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

我們因此現在知道使用枚舉值而不是密鑰。

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) 
0

借用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); 
}