プリコンパイルされた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との互換性が必要です。