2016-02-29 71 views
0

這是我的代碼,反序列化時出現此錯誤。我在同一個調用中測試它,所以.NET的版本控制不應該成爲問題。我的用戶數據是一個基本的poco對象。加密和編碼序列化數據有什麼問題嗎?

步驟1中,序列化和加密:

byte[] userDataArray; 
    BinaryFormatter bf = new BinaryFormatter(); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     bf.Serialize(ms, _logicLibrary.userData); 
     userDataArray = ms.ToArray(); 
    } 

    string data = Encoding.UTF8.GetString(userDataArray); 

    var encrytedUserData = logic.Encrypt(data); 

    return Encoding.UTF8.GetBytes(encrytedUserData); 

步驟2解密和反序列化:

public UserData DeserializeUserData(string data) 
    { 
     string decryptedSerializedData = _logicLibrary.RunDecrypt(data); 

     var dataBytes = Encoding.UTF8.GetBytes(decryptedSerializedData); 

     BinaryFormatter bf = new BinaryFormatter(); 
     using (MemoryStream ms = new MemoryStream(dataBytes)) 
     { 
      return bf.Deserialize(ms) as UserData; 
     } 

    } 

反序列化時我的錯誤是這樣的:

{「二進制流「189 '不包含有效的BinaryHeader。可能的 原因是無效的流或對象版本在 序列化和反序列化。「}

+4

爲什麼要將字節從二進制序列化轉換爲字符串?這可能是你的問題的原因。 –

+3

你正在破壞你的序列化數據,它是二進制數據,你不能將它轉換爲字符串而不會破壞它。 – Gusman

+0

這是用戶數據,需要加密並保存。認爲這會工作。 –

回答

0

基於良好的建議,在這裏我返工我的加密方法,以接受輸入和類型爲byte []的輸出。之後,我確信任何不是字符串的數據都不會觸及Encoding.UTF8,其基礎包括以下的許多內容:post。這些技巧結合起來使我的代碼工作。 UserData是一個自定義類。

private UserData DeserializeUserData(byte[] data) 
{ 
    byte[] decryptedSerializedData = logic.Decrypt(data); 


    BinaryFormatter bf = new BinaryFormatter(); 
    using (MemoryStream ms = new MemoryStream(decryptedSerializedData)) 
    { 
     return bf.Deserialize(ms) as UserData; 
    } 

} 

private byte[] SerializeUserData(UserData userData) 
{ 
    byte[] userDataArray; 
    BinaryFormatter bf = new BinaryFormatter(); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     bf.Serialize(ms, userData); 
     userDataArray = ms.ToArray(); 
    } 

    return logic.Encrypt(userDataArray); 

} 
+0

'BinaryFormatter'不適用於持久存儲或跨機器使用。這是非常嚴重的版本變化,並且可能會在Windows更新或發佈新版本的程序後獲取突然不可讀的數據。你可能想要考慮一個不同的第三方二進制序列化器,比如'ProtoBuf'或者切換到像XmlSeralizer這樣的序列化器中建立的更容忍更多的容器。 –

+0

這是一個很好的觀點。在這種情況下,我相信我們沒問題,因爲我們正在使用這種狀態持久性。創建二進制數據的相同機器/代碼是唯一將其反序列化的機器/代碼。 –