設計上、リモート アセンブリに由来するオブジェクトのクラスがいくつかあります。インスタンスが異なるアセンブリからロードされた場合でも、これらのクラスのインスタンスが等しいかどうかを比較できるようにしたいと考えています。実際には、これらはネットワークの場所または Web から読み込まれ、ローカル キャッシュと比較したいと思います。シリアライゼーションとカスタム シリアライゼーション バインダーを使用するソリューションから、いくつかの良い結果が得られました。
比較に使用しているサンプル クライアント コードは次のとおりです。
Assembly a = Assembly.LoadFile(@"c:\work\abc1\abc.dll");
Type t1 = a.GetType("Abc.Def");
Assembly b = Assembly.LoadFile(@"c:\work\abc2\abc.dll");
Type t2 = b.GetType("Abc.Def");
Object o1 = t1.GetConstructors()[0].Invoke(null);
Object o2 = t2.GetConstructors()[0].Invoke(null);
Console.WriteLine(o1.Equals(o2));
アセンブリで使用しているパターンは次のとおりです。
namespace Abc
{
internal sealed class DefBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Type ttd = null;
try
{
ttd = this.GetType().Assembly.GetType(typeName);
}
catch (Exception any)
{
Debug.WriteLine(any.Message);
}
return ttd;
}
}
[Serializable]
public class Def
{
public Def()
{
Data = "This is the data";
}
public String Data { set; get; }
public override bool Equals(object obj)
{
if (obj.GetType().FullName.Equals(this.GetType().FullName))
{
try
{
BinaryFormatter bf = new BinaryFormatter();
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bf.Serialize(ms, obj);
ms.Seek(0, System.IO.SeekOrigin.Begin);
bf.Binder = new Abc.DefBinder();
Abc.Def that = (Abc.Def)bf.Deserialize(ms);
if (this.Data.Equals(that.Data))
{
return true;
}
}
catch (Exception any) {
Debug.WriteLine(any.Message);
}
}
return false;
}
}
}
私の質問は次のとおりです:これは機能しているように見えますが、ハッキーに感じます。異なるアセンブリからロードされる可能性のあるオブジェクトを比較するより直接的な方法はありますか?