考虑以下对象:
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);
}
}
}