-1

考虑以下对象:

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);
        }
    }
}
4

1 回答 1

0

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

于 2013-06-06T19:30:25.850 回答