問題なく DataContractSerializer を介してオブジェクトをシリアル化しています。
しかし、このオブジェクトを暗号化されたファイルにシリアライズしようとすると、デシリアライズ時に例外が発生します。
これが私のコードです:
public static bool SerializeDataContract<t>(Stream fileStream, t o, bool bCrypt = false)
{
DataContractSerializer serializer = new DataContractSerializer(typeof(t));
if(bCrypt)
{
TripleDESCryptoServiceProvider crypt = new TripleDESCryptoServiceProvider();
crypt.IV = CRYPT_INIT_VECTOR;
crypt.Key = CRYPT_KEY;
crypt.Padding = PaddingMode.Zeros;
using(CryptoStream cryptoStream = new CryptoStream(fileStream, crypt.CreateEncryptor(), CryptoStreamMode.Write))
{
serializer.WriteObject(cryptoStream, o);
cryptoStream.Close();
}
}
else
serializer.WriteObject(fileStream, o);
return true;
}
public static bool DeserializeDataContract<t>(Stream fileStream, out t o, bool bCrypt = false)
{
o = default(t);
try
{
DataContractSerializer serializer = new DataContractSerializer(typeof(t));
if(bCrypt)
{
TripleDESCryptoServiceProvider crypt = new TripleDESCryptoServiceProvider();
crypt.IV = CRYPT_INIT_VECTOR;
crypt.Key = CRYPT_KEY;
crypt.Padding = PaddingMode.Zeros;
using(CryptoStream cryptoStream = new CryptoStream(fileStream, crypt.CreateDecryptor(), CryptoStreamMode.Read))
{
//TraceXML(cryptoStream);
o = (t)serializer.ReadObject(cryptoStream);
cryptoStream.Close();
}
}
else
{
o = (t)serializer.ReadObject(fileStream);
}
}
catch(Exception ex)
{
return false;
}
return true;
}
bCrypt=false で 2 つの関数を呼び出すと、すべてが期待どおりに機能します。しかし、bCrypt=true で関数を呼び出すと、デシリアライズ時に例外が発生します。
例外は次のとおりです (ドイツ語から英語への翻訳): SerializationException: ルート レベルのデータが無効です。
復号化後に読み取られたデータをトレースすると、データは問題ないように見えます。つまり、暗号化なしのシリアル化のように見えます。
私のコードのどこにバグがあるか知っていますか?
それとも、DataContractSerializer で暗号化を使用できないのでしょうか?