Silverlight アプリがあります。このアプリは、(私が作成した) Web サービスにコールバックして、顧客のリストを取得します。顧客のリストを表すハッシュ コードを生成しようとしています。これを行うために、Silverlight アプリとサーバー側のコードに次のコードを記述しました。
public static string GetHashCode<T>(T data)
{
SHA256Managed crypto = new SHA256Managed();
try
{
// Serialize the object
byte[] serializedBytes;
using (var memoryStream = new MemoryStream())
{
var serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(memoryStream, data);
memoryStream.Seek(0, SeekOrigin.Begin);
serializedBytes = memoryStream.ToArray();
}
byte[] hashed = crypto.ComputeHash(serializedBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashed.Length; i++)
sb.Append(hashed[i].ToString("X2"));
return sb.ToString();
}
catch (Exception)
{
return string.Empty;
}
}
サーバー側での私の方法は次のようになります。
[OperationContract]
public List<Customer> GetCustomers()
{
List<Customer> customers = Customer.GetAll();
string hash = GetHashCode<List<Customer>>(customers);
return customers;
}
クライアント側の Silverlight アプリでは、GetCustomersCompleted イベント ハンドラーに次のように記述しています。
string hash = GetHashCode<List<Customer>>(e.Result.ToList());
最初にイベント ハンドラー Result をリストに変換していることに注意してください。その理由は、Result が実際には ObservableCollection であるためです。これが私の問題があるところだと信じているので、私はこれを持ち出します。
私の問題は、データが同じであっても、サーバー側とクライアント側でハッシュ値が異なることです。これは、ウォッチ ウィンドウに表示されている内容に基づいています。結果がサーバーからアプリに渡されるときに発生するシリアル化と関係があると感じています。ただし、これを回避する方法がわかりません。データのハッシュが必要ですが、それらを並べる方法がわかりません。ご協力いただきありがとうございます。