2

次の状況で逆シリアル化を強制的に失敗させる非侵入型の方法を探しています。

  • 厳密に名前が付けられたアセンブリで型が定義されていません。
  • BinaryFormatter が使用されます。
  • シリアル化されてから、型が変更されました (たとえば、プロパティが追加されました)。

以下は、失敗した NUnit テストの形での問題の図/再現です。クラスを変更せずにこのパスを作成する一般的な方法を探しています。できればシリアライゼーションおよび/またはデシリアライゼーション中にData設定するだけです。BinaryFormatterまた、影響を受ける型ごとに特定の知識が必要になる可能性が高いため、シリアライゼーション サロゲートも関与させたくありません。

ただし、MSDN ドキュメントには、私を助けるものは何も見つかりません。

[Serializable]
public class Data
{
  public string S { get; set; }
}

public class DataSerializationTests
{
    /// <summary>
    /// This string contains a Base64 encoded serialized instance of the
    /// original version of the Data class with no members:
    /// [Serializable]
    /// public class Data
    /// { }
    /// </summary>
    private const string Base64EncodedEmptyDataVersion =
        "AAEAAAD/////AQAAAAAAAAAMAgAAAEtTc2MuU3Rvcm0uRGF0YS5UZXN0cywgV"+
        "mVyc2lvbj0xLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2"+
        "VuPW51bGwFAQAAABlTc2MuU3Rvcm0uRGF0YS5UZXN0cy5EYXRhAAAAAAIAAAAL";

    [Test]
    public void Deserialize_FromOriginalEmptyVersionFails()
    {
        var binaryFormatter = new BinaryFormatter();
        var memoryStream = new MemoryStream(Convert.FromBase64String(Base64EncodedEmptyDataVersion));

        memoryStream.Seek(0L, SeekOrigin.Begin);

        Assert.That(
            () => binaryFormatter.Deserialize(memoryStream),
            Throws.Exception
        );
    }
}
4

1 に答える 1