0

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;
    }
}
4

1 に答える 1

-1

サロゲートは、ルート以外のオブジェクトで確実に呼び出されます。私は、自分のコードでまさにそのためにサロゲートを定期的に使用しています。

String は、テストに使用するのに適した Type ではないと思います。

于 2013-05-21T03:33:56.217 に答える