考虑以下对象:
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);
}
}
}
答案 0 :(得分:0)
BinarySerializer和XmlSerializer根本不处理这个问题。如果您需要这样的东西,那么您可以在序列化程序和可序列化对象之间开发某种“契约”。我不认为有一种很好的方法可以为任何类型的对象制作这种通用。