次のオブジェクトを検討してください。
class MyObject
{
public string StringValue { get; set; }
public List<int> Numbers { get; set; }
}
カスタム シリアライザー (任意の型のオブジェクトを使用できます) でスレッド セーフなシリアライズを有効にして、シリアライズ中に MyObject を編集からロックしたいと考えています。その後、シリアル化されている間、編集からロックされますNumbers
(StringValue
既に不変ですが)。
特定のオブジェクトをロックして、他のスレッドがアクセス/変更できないようにして、シリアル化中にオブジェクトツリーが変更されないようにする方法はありますか? そうでない場合、これはシリアライザーが対処する必要がある問題ではなく、シリアライザーのユーザーの問題であると見なされますか? BinarySerializer と XmlSerializer はこれをどのように処理しますか?
注: lock(){}
私が探していることはしません。他のスレッドがそのオブジェクトをロックするのを防ぐメカニズムを提供するだけです。そのオブジェクトはまだ編集されている可能性があります:
class Program
{
private static List<int> _list;
static void Main(string[] args)
{
_list = new List<int>{1,2,3};
var thread = new Thread(Edit) {IsBackground = true};
lock (_list)
{
_list.Add(4);
thread.Start();
Thread.Sleep(20);
_list.Add(100);
}
while (thread.IsAlive) {}
_list.ForEach(Console.WriteLine);
Console.ReadLine();
}
static void Edit()
{
for (int i = 5; i < 35; i++)
{
_list.Add(i);
Thread.Sleep(1);
}
}
}