簡體   English   中英

反序列化C#

[英]deserialization c#

我有一個包含此類的WPF應用程序:*

{[Serializable]
public class Parametres
{
    private string admin_login;
    private string admin_pwd;
    private string server;
    private string db;
    private string user;
    private string pwd;}

我用這個功能序列化一個對象:

  public static void Serialize_Parametres(string filename, Parametres obj)
    {
        using (FileStream fs = File.Open(filename, FileMode.OpenOrCreate))
        {
            using (CryptoStream cs = new CryptoStream(fs, key.CreateEncryptor(), CryptoStreamMode.Write))
            {
                XmlSerializer xmlser = new XmlSerializer(typeof(Parametres));
                xmlser.Serialize(cs, obj);
            }
        }
    }

它工作正常,並生成文件.txt,但是當我嘗試反序列化此文件並通過此函數獲取對象參數時:

 public static Parametres DeSerialize_Parametres(string filename)
        {
            using (FileStream fs = File.Open(filename, FileMode.Open))
            {

              using (CryptoStream cs = new CryptoStream(fs, key.CreateDecryptor(), CryptoStreamMode.Read))

                {

                    XmlSerializer xmlser = new XmlSerializer(typeof(Parametres));
                    return (Parametres)xmlser.Deserialize(cs);

                }
            }


        }

我收到此錯誤Length of the data to decrypt is invalid在行return (Parametres)xmlser.Deserialize(cs); Length of the data to decrypt is invalid return (Parametres)xmlser.Deserialize(cs);

此錯誤的確切原因是什么? 我該如何解決?

使用此技術序列化對象時,必須分兩部分進行。 長度加密的流必須作為最終流的一部分進行存儲,具體取決於您執行此操作。 但是,您應該將其分解為更可重用的形式。

例如,首先將所需的圖形序列化為字節流; 然后加密字節流; 然后將其保存到文件中。

以下是有關如何使用AES序列化到文件的示例:

    public class ObjectXmlSerializer
    {
        //---------------------------------------------------------------------
        public override Byte[] Serialize(Object obj)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                new XmlSerializer(obj.GetType()).Serialize(ms, obj);
                return ms.ToArray();
            }
        }
        //---------------------------------------------------------------------
        public override T Deserialize<T>(Byte[] bObj)
        {
            using (MemoryStream ms = new MemoryStream(bObj))
            {
                return (T)new XmlSerializer(typeof(T)).Deserialize(ms);
            }
        }
        //---------------------------------------------------------------------
        public override T Deserialize<T>(Stream iostream)
        {
            return (T)new XmlSerializer(typeof(T)).Deserialize(iostream);
        }
    }

// 下一個

public static class CryptoSerivces
{
        //---------------------------------------------------------------------
        public static Byte[] AesEncrypt(Byte[] src, Byte[] key, Byte[] IV)
        {
            using (RijndaelManaged myRijndael = new RijndaelManaged())
            {
                try
                {
                    myRijndael.Mode = CipherMode.CBC;
                    myRijndael.Key = key;
                    myRijndael.IV = IV;
                    myRijndael.Padding = PaddingMode.PKCS7;

                    using (ICryptoTransform encryptor = myRijndael.CreateEncryptor())
                    using (MemoryStream msEncrypt = new MemoryStream())
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        csEncrypt.Write(src, 0, src.Length);
                        csEncrypt.FlushFinalBlock();

                        return msEncrypt.ToArray();
                    }
                }
                finally
                {
                    myRijndael.Clear();
                }
            }
        }
        //---------------------------------------------------------------------
        public static Byte[] AesDecrypt(Byte[] src, Byte[] key, Byte[] IV)
       {
        using (RijndaelManaged myRijndael = new RijndaelManaged())
        {
            try
            {
                myRijndael.Mode = CipherMode.CBC;
                myRijndael.Key = key;
                myRijndael.IV = IV;
                myRijndael.Padding = PaddingMode.PKCS7;

                using (ICryptoTransform decryptor = myRijndael.CreateDecryptor())
                using (MemoryStream msDecrypt = new MemoryStream())
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Write))
                {
                    csDecrypt.Write(src, 0, src.Length);
                    csDecrypt.FlushFinalBlock();

                    return msDecrypt.ToArray();
                }
            }
            finally
            {
                myRijndael.Clear();
            }
        }
    }
}

//將所有調味料放在一起

void SaveToFile(String fileName, Parametres obj)
{
   ObjectXmlSerializer oxs = new ObjectXmlSerializer();
   Byte[] bObj = oxs.Serialize(obj);
   Byte[] bEncObj = CryptoSerivces.AesEncrypt(bObj, SomeKey, SomeIV);

   using (FileStream fs = File.Open(filename, FileMode.OpenOrCreate))
   {
      fs.Write(bEncObj, 0, bEncObj.Length);
   }
}

//我會把讀數留給你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM