When I want to DeserializeObject, it gives an error which says "Bad Data".
After file data conversion succeed, it gives error on disposing or closing stream
#########Error at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) at System.Security.Cryptography.Utils._DecryptData(SafeKeyHandle hKey, Byte[] data, Int32 ib, Int32 cb, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode PaddingMode, Boolean fDone) at System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) at System.Security.Cryptography.CryptoStream.FlushFinalBlock() at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) at System.IO.Stream.Close() at System.IO.Stream.Dispose() at BinaryFileHelper.DeserializeObject[T](String filename)
#########Error
private static DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider() { Key = System.Text.Encoding.UTF8.GetBytes("12345678".Substring(0, 8)), IV = new byte[] { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF } }; public static void SerializeObject(string filename, object objectToSerialize) { using (Stream stream = File.Open(filename, FileMode.OpenOrCreate)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); using (Stream cryptoStream = new CryptoStream(stream, cryptic.CreateEncryptor(), CryptoStreamMode.Write)) { binaryFormatter.Serialize(cryptoStream, objectToSerialize); } } } public static T DeserializeObject<T>(string filename) { T objectFromDeserialize; using (Stream stream = File.Open(filename, FileMode.Open)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); using (Stream cryptoStream = new CryptoStream(stream, cryptic.CreateDecryptor(), CryptoStreamMode.Read)) { objectFromDeserialize = (T)binaryFormatter.Deserialize(cryptoStream); } // After conversion succeed, it gives error on disposing or closing at this line } return objectFromDeserialize; }
The problem is the usage of OpenOrCreate
instead of Create
. The reason being is that OpenOrCreate
will create a FileStream
for appending to the end of a file, if the file already exists. Whereas Create
will delete the existing file before creating a new file.
public static void SerializeObject(string filename, object objectToSerialize)
{
using (Stream stream = File.Open(filename, FileMode.Create))//Changed
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (Stream cryptoStream = new CryptoStream(stream, cryptic.CreateEncryptor(), CryptoStreamMode.Write))
{
binaryFormatter.Serialize(cryptoStream, objectToSerialize);
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.