在序列化期间从另一个线程更改对象

时间:2013-06-06 19:21:01

标签: c# multithreading serialization

考虑以下对象:

class MyObject
{
    public string StringValue { get; set; }
    public List<int> Numbers { get; set; }
}

我想在自定义序列化程序中启用线程安全序列化(可以使用任何类型的对象),以便在序列化时锁定MyObject。随后,在序列化编辑时,它会锁定NumbersStringValue(即使它已经是不可变的)。

有没有办法可以锁定任何给定的对象,以便其他线程无法访问/修改它,以便在我序列化时我的对象树不会改变?如果不是,这被认为不是串行器需要解决的问题,而是序列化器的用户之一? 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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

BinarySerializer和XmlSerializer根本不处理这个问题。如果您需要这样的东西,那么您可以在序列化程序和可序列化对象之间开发某种“契约”。我不认为有一种很好的方法可以为任何类型的对象制作这种通用。