SurrogatSelector を使用して、ストリームの逆シリアル化をカスタマイズしようとしています。オブジェクト グラフのルート オブジェクトに対しては正常に機能しますが、含まれているオブジェクトに対しては機能しません。次のコードを参照してください。
Stream stream = File.Open("C:\\Temp\\test.bin", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
TestToSerialize tts = new TestToSerialize();
formatter.Serialize(stream, tts);
stream.Close();
stream = File.Open("C:\\Temp\\test.bin", FileMode.Open);
formatter = new BinaryFormatter();
SurrogateSelector ss = new SurrogateSelector();
ss.AddSurrogate(typeof(string), new StreamingContext(StreamingContextStates.All), new StringSerializationSurrogate());
formatter.SurrogateSelector = ss;
tts = (TestToSerialize)formatter.Deserialize(stream);
stream.Close();
StringSerializationSurrogate は、文字列が逆シリアル化されるときに呼び出されます (メソッド SetObjectData) が、文字列を (シリアル化可能なメンバーとして) 含むオブジェクトが逆シリアル化されるときは呼び出されません。シリアライズ/デシリアライズするオブジェクトは次のようになります。
[Serializable]
class TestToSerialize
{
public string s1;
public TestToSerialize()
{
s1 = "some test";
}
}
ルート以外のオブジェクトでサロゲートを呼び出す方法はありますか? 完全を期すために、サロゲートは次のようになります (ブレークポイントを設定するためのテストコードのみ)。
sealed class StringSerializationSurrogate : ISerializationSurrogate
{
public void GetObjectData(Object obj, SerializationInfo info, StreamingContext context)
{
}
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
string s = (String)obj;
return obj;
}
}