.NET: Сериализация объектов в транзакционную среду - PullRequest
1 голос
/ 16 августа 2010

Мне нужен способ сериализации объектов в транзакционном контексте.

С учетом следующего псевдокода:

transation.Begin()
try{
    serializeObj(obj1);
    serializeObj(obj2);
    serializeObj(obj3);
}
catch(Exception){
    transaction.RollBack();
}
transaction.Commit();

Я хочу, чтобы после выполнения этого кода все объекты были сериализованы или ни один из них не был сериализован.

Я не думаю, что TransactionScpe дает мне такую ​​возможность. Я предпочел бы некоторый встроенный механизм .NET вместо некоторой внешней библиотеки.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 августа 2010

Если у вас есть транзакционная файловая система ( транзакция ntfs ), я думаю, вы можете достичь того, что вы хотите, с помощью методов, описанных в this и в этом blog . Также стоит посмотреть alphafs (они написали управляемую оболочку для транзакции ntfs), но я не знаю статус проекта.

0 голосов
/ 16 августа 2010

Предполагая, serializeObj(Object obj) специально сериализуется в файл:

List<string> FileNames = new List<string>();
try
{        
    serializeObj(obj1);
    //Add a method to determine the filename to which you wrote
    FileNames.Add(GetSerializedFileName(obj1)) 
    //repeat for all your objects
}
catch(Exception)
{
    Foreach(string fn in FileNames)
    {
        if(File.Exists(fn) File.Delete(fn);
    }
}

Предполагая, что serializeObj(Object obj) просто записывает в поток памяти для ввода-вывода позже, это даже проще:

List<Stream> Files = new List<Stream>();
try
{        
    Files.Add(serializeObj(obj1));
    //repeat for all your objects
}
catch(Exception)
{
    Foreach(Stream fn in Files)
    {
        fn.Dipose();
    }
}   
...