У меня есть следующий код для сериализации дешифрованных и десериализации зашифрованных объектов из двоичного файла.Написание расшифрованных объектов работает хорошо.Однако при попытке десериализации дешифрованных объектов из файла происходит сбой после успешной десериализации первого объекта.
Я надеялся, что кто-то может указать мне на ошибку, поскольку у меня закончились идеи.
Запись зашифрованных объектов в двоичный файл работает очень хорошо
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);
}
}