c # Исключение при десериализации зашифрованного объекта из двоичного файла - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующий код для сериализации дешифрованных и десериализации зашифрованных объектов из двоичного файла.Написание расшифрованных объектов работает хорошо.Однако при попытке десериализации дешифрованных объектов из файла происходит сбой после успешной десериализации первого объекта.

Я надеялся, что кто-то может указать мне на ошибку, поскольку у меня закончились идеи.

Запись зашифрованных объектов в двоичный файл работает очень хорошо



    public List ReadAllObjectsFromFile(string pPath)
                {
                    List objList = null;
                    T obj = default(T);
                    using (FileStream stream = new FileStream(pPath, FileMode.Open, FileAccess.Read))
                    {
                        while (true)
                        {
                            if (stream.Length>m_ReaderPosition)
                            {
                                stream.Seek(m_ReaderPosition, SeekOrigin.Begin);
                                if (IsEncrypted)
                                {
                                    using (Stream cryptoStream = new CryptoStream(stream, m_Decryptor, CryptoStreamMode.Read))
                                    {
                                        if (objList == null) objList = new List();
                                        obj = (T)m_Formatter.Deserialize(cryptoStream);
                                    }
                                }
                                else
                                {
                                    if (objList == null) objList = new List();
                                    obj = (T)m_Formatter.Deserialize(stream);
                                }
                                m_ReaderPosition = stream.Position;
                            }

                            if ((IsReadToEnd = object.Equals(obj, default(T)))) break;
                            else
                            {
                                objList.Add(obj);
                                obj = default(T);
                            }
                        }
                    }
                    return objList;
                }

Попытка чтения зашифрованных объектов из двоичного файла и десериализации их в дешифрованные объектыкак исключение для второго объекта, он пытается десериализовать

"System.Runtime.Serialization.SerializationException:« Входной поток не является допустимым двоичным форматом. Начальное содержимое (в байтах): 83-AD-D4-BB-F9-7A-4E-34-C2-E7-4F-0C-4F-51-F2-1E-EC .. "

Метод успешно десериализованпервый объект, хотя.Эта строка кода вызывает исключение для второго объекта.

obj = (T) m_Formatter.Deserialize (cryptoStream);



    public List ReadAllObjectsFromFileEnc(string pPath)
            {
                List objList = null;
                T obj = default(T);
                using (FileStream stream = new FileStream(pPath, FileMode.Open, FileAccess.Read))
                {
                    using (Stream cryptoStream = new CryptoStream(stream, m_Decryptor, CryptoStreamMode.Read))
                    {
                        while (true)
                        {
                            if (stream.Length>m_ReaderPosition)
                            {
                                stream.Seek(m_ReaderPosition, SeekOrigin.Begin);
                                if (objList == null) objList = new List();
                                obj = (T)m_Formatter.Deserialize(cryptoStream);
                                m_ReaderPosition = stream.Position;
                            }

                            if ((IsReadToEnd = object.ReferenceEquals(obj, default(T)))) break;
                            else
                            {
                                objList.Add(obj);
                                obj = default(T);
                            }
                        }
                    }
                    return objList;
                }
            }

Main



    static void Main(string[] args)
            {
                List objList = new List();
                objList.Add(
                    new Bear()
                    {
                        Name = "John",
                        Age = 35,
                        Birth = new DateTime(1977, 02, 02),
                        Females = new KeyValuePair("Dove", "Mumu")
                    });
                objList.Add(
                    new Bear()
                    {
                        Name = "Max",
                        Age = 40,
                        Birth = new DateTime(1977, 08, 02),
                        Females = new KeyValuePair("Gr", "Mumu")
                    });
                objList.Add(
                    new Bear()
                    {
                        Name = "Mika",
                        Age = 21,
                        Birth = new DateTime(1990, 02, 02),
                        Females = new KeyValuePair("Dr", "Mumu")
                    });
                objList.Add(
                    new Bear()
                    {
                        Name = "Miles",
                        Age = 90,
                        Birth = new DateTime(1901, 02, 02),
                        Females = new KeyValuePair("SE", "Mumu")
                    });

                BinarySerializer binser = new BinarySerializer(@"E:\Temp\myFile.bin", 10000, true, "My Encryption is here");
                foreach(Bear t in objList)
                    binser.WriteObjectToFile(binser.FileDetails.FullName, t);

                objList = null;

                objList = binser.ReadAllObjectsFromFileEnc(binser.FileDetails.FullName);
            }

Вот запись в файл



    public void WriteObjectToFile(string pPath, object pObject)
            {
                using (FileStream stream = new FileStream(pPath, FileMode.Append, FileAccess.Write))
                {
                    if (IsEncrypted)
                    {
                        using (Stream cryptoStream = new CryptoStream(stream, m_Encryptor, CryptoStreamMode.Write))
                        {
                            // 3. write to the cryptoStream
                            m_Formatter.Serialize(cryptoStream, pObject);
                        }
                    }
                    else
                        m_Formatter.Serialize(stream, pObject);
                }
            }

...