Сериализация и десериализация Oracle.DataAccess.OracleException в C # - PullRequest
2 голосов
/ 04 ноября 2011

OracleException не имеет ни открытых конструкторов, ни какого-либо способа получить новый экземпляр.Я попробовал свой класс XmlSerializerHelper, но он требует открытого конструктора без параметров.

Я использовал BinaryFormatter для сериализации OracleException и записал его в файл.

Как я могу сериализовать OracleException в файле, а также десериализовать, используя XmlSerializer - по причинам тестирования - ?.

Ссылка: http://geekswithblogs.net/WillSmith/archive/2008/07/25/testing-oracleexception.aspx

PD: лучше SoapFormatter или BinaryFormatter?

Код

SerializationHelper.Serialize(@"C:\Temp\ExcepcionOracle.bin", ex);

var exOra = SerializationHelper.Deserialize(@"C:\Temp\ExcepcionOracle.bin");


public static void Serialize(string fileName, Object obj)
        {
            var binaryFormatter = new BinaryFormatter();
            var fileStream = new FileStream(fileName, FileMode.Create);
            try
            {
                binaryFormatter.Serialize(fileStream, obj);
            }
            catch (SerializationException ex)
            {
                throw new ApplicationException("The object graph could not be serialized", ex);
            }
            finally
            {
                fileStream.Close();
            }
        }


        public static object Deserialize(string fileName)
        {
            var binaryFormatter = new BinaryFormatter();
            var fileStream = new FileStream(fileName, FileMode.Open);
            try
            {
                fileStream.Seek(0, SeekOrigin.Begin);
                return binaryFormatter.Deserialize(fileStream);
            }
            catch (SerializationException ex)
            {
                throw new ApplicationException("Serialization Exception: " + ex.Message);
            }
            finally
            {
                fileStream.Close();
            }
            return null;
        }  

1 Ответ

0 голосов
/ 04 ноября 2011

такие вещи, как Exception просто не очень подходят для сериализаторов xml (и XmlSerializer в частности). В дополнение к проблемам конструктора (которые некоторые сериализаторы могут обойти, а некоторые нет), вы также можете столкнуться с проблемами с неожиданными подклассами и произвольными данными в коллекции.

Если вы выполняете сериализацию в формате xml, вам, вероятно, следует просто захватить ключевую информацию, которая вам нужна - возможно, .Message и некоторые другие вещи. Также обратите внимание, что в клиент-серверном приложении клиенту на самом деле не нужно много знать о деталях сбоя, которые должны оставаться на сервере. Либо это ошибка exected (недопустимые параметры, проблемы со входом в систему, ограничения квот и т. Д.), Либо ошибка неожиданная . В последнем случае: просто скажите, что произошла непредвиденная ошибка . Подробности будут полезны только для разработчика, и у разработчика уже должен быть доступ к журналу ошибок сервера.

...