1

プリコンパイルされたprotobuf-netシリアライザーオブジェクトを使用して逆シリアル化された2つのオブジェクト間の値の同等性をチェックするために、オブジェクトにEqualsオーバーライドがあります。デシリアライズが期待どおりに行われることを確認しました(その点で、protobuf-netは素晴らしいです)。

このクラスは非常に単純ですが、他のより複雑なクラスでも同等の問題が発生するため、これをモデルとして使用します。

問題のコードフラグメントは次のとおりです。

public bool Equals (CompressionConfiguration other) {
    if (ReferenceEquals(null, other)) return false;
    if (ReferenceEquals(this, other)) return true;
return string.Equals (AlgorithmName, other.AlgorithmName) &&
        (AlgorithmConfiguration == null ? other.AlgorithmConfiguration == null : 
        AlgorithmConfiguration.SequenceEqual(other.AlgorithmConfiguration));
}

.NETランタイムで実行すると、これは期待どおりに評価され、byte[]タイプのAlgorithmConfigurationにnull値が許可されます。Monoでは、SequenceEqual nullパラメーターエラー、具体的にはArgumentNullExceptionが発生します。何が得られますか?SequenceEqualは、AlgorithmConfiguration!= nullの場合にのみ呼び出す必要があるため、これは発生しないはずです。

圧縮構成に長さゼロのbyte[]を指定しても障害が発生しないため、これは間違いなくソースです。可能であれば、長さゼロの配列は送信したくありません。これはXamarin.Android(MonoDroid)とMonoTouch、およびMonoサーバー、そして.NETデスクトップアプリケーションで使用されるため、Monoとの互換性が必要です。

4

1 に答える 1