在意识到您需要什么之后,使用正确属性修饰的以下方法应该可以工作......您只需要在序列化期间和之后以及反序列化之后运行一些自定义代码......
// Save your password so you can reset it after the object has been serialized.
[NonSerialized()]
private string SavedPassword;
// This saves the value of Password and Encrpts it so it will be stored Encrypted.
// I am leaving out the Encrypt code to make it cleaner here.
[OnSerializing()]
internal void OnSerializingMethod(StreamingContext context)
{
SavedPassword = Password;
Password = Encrypt(Password);
}
// reset the Password after serialization so you can continue to use your object.
[OnSerialized()]
internal void OnSerializedMethod(StreamingContext context)
{
Password = SavedPassword;
}
// On deserialize you need to Decrypt your Password.
[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context)
{
Password = Decrypt(Password);
}
属性和方法的解释...
[NonSerialized()] - 告诉序列化程序不要在序列化对象中包含此字段/属性。
[OnSerializing()] - 告诉序列化程序在序列化对象之前调用此方法。我们的加密代码放在这里是因为我们希望对密码的加密值进行序列化。
[OnSerialized()] - 告诉序列化程序在对象被序列化后调用此方法。我们需要在这里将密码重置为未加密状态。(而不是保存未加密的密码,您可以在这里轻松地进行解密)
[OnDeserialized()] - 告诉序列化程序在对象被反序列化后调用此方法。这是我们解密的地方,因为在我们解密密码之前,该对象还没有准备好使用。
有了这些属性和方法,Password 属性将在序列化期间自动加密并在反序列化期间解密。