【问题标题】:Serialize and Deserialize Oracle.DataAccess.OracleException in C#在 C# 中序列化和反序列化 Oracle.DataAccess.OracleException
【发布时间】:2011-11-04 12:36:52
【问题描述】:

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

【问题讨论】:

  • 为什么需要对异常进行序列化和反序列化?
  • Re BinaryFormatterSoapFormatter... 好吧,我强烈认为“两者都不是”,但 SoapFormatter官方要避免的(MSDN 指出它是过时的)。 BinaryFormatter 仍然被钉在手上……唯一一次使用BinaryFormatter 是为了取笑它。

标签: c# exception serialization deserialization oracleexception


【解决方案1】:

Exception 这样的东西根本不适合xml 序列化程序(尤其是XmlSerializer)。除了构造函数问题(有些序列化程序可以解决,有些不能)之外,您还可能会遇到意外子类和集合中任意数据的问题。

如果您将序列化为 xml,您可能应该只捕获您需要的关键信息 - 也许是 .Message 和其他一些东西。另请注意,在客户端/服务器应用程序中,客户端实际上并不需要知道很多失败的细节——这些细节应该保留在服务器上。要么是执行错误(无效参数、登录问题、配额限制等),要么是意外错误。在后一种情况下:只是说发生了意外错误。详细信息只对开发人员有用,开发人员应该已经可以访问服务器的错误日志。

【讨论】:

  • 同意。不过,不是所有异常都应该标记为 [Serializable] 并提供默认构造函数(出于完全不同的原因,例如远程处理)? FxCop 一直在唠叨我……甲骨文在这里没有遵循“最佳实践”吗?
  • @Anders 只对BinaryFormatter有用; OP正在询问XmlSerializer
  • 我知道。我只是指出这整个问题是因为 Oracle 显然没有遵循设计准则,即异常应该有一个公共的无参数构造函数。也就是说,我同意在这种情况下不应将异常传递给客户端。
  • @Anders 视情况而定——据我所知,这可能是一些不同私有异常类型的抽象基类...课程用马
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 2014-01-06
  • 2016-11-14
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 2015-05-18
  • 2011-01-22
相关资源
最近更新 更多