1

OracleException에는 public 생성자가 없으며 새 인스턴스를 얻을 수있는 방법이 없습니다. 내 XmlSerializerHelper 클래스를 시도했지만 public 매개 변수가없는 생성자가 필요합니다.C에서 Oracle.DataAccess.OracleException 직렬화 및 역 직렬화

BinaryFormatter를 사용하여 OracleException을 직렬화하고이를 파일에 기록했습니다.

파일에서 OracleException을 직렬화하고 XmlSerializer를 사용하여 직렬화를 테스트하는 이유는 무엇입니까?

참조 : http://geekswithblogs.net/WillSmith/archive/2008/07/25/testing-oracleexception.aspx

PD는 : 더 나은 SoapFormatter 또는 경우 BinaryFormatter인가? Exception 같은

코드

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

왜 예외를 serialize하고 deserialize해야합니까? –

+0

Re'BinaryFormatter' vs'SoapFormatter' ... 글쎄, 나는 강력하게 "둘다"라고 주장 할 것이지만, SoapFormatter는 피할 수있다. (MSDN은 쓸모 없다). 'BinaryFormatter' 여전히 손톱에 매달려 있습니다 ... 유일한 시간 ** 나는'BinaryFormatter'를 사용하여 재미를 털어 놓습니다. –

답변

0

일이 단순히 XML 시리얼 라이저 (특히 XmlSerializer)에 매우 적합하지 않습니다. 생성자 문제 (일부 serializer는 해결할 수 있고 일부는 수행 할 수 없음) 외에도 컬렉션의 예기치 않은 하위 클래스 및 임의 데이터에 문제가 발생할 수 있습니다.

xml로 직렬화하는 경우 필요한 키 정보 (예 : .Message 등)를 캡처해야합니다. 또한 클라이언트/서버 응용 프로그램에서 클라이언트는 실제로 서버에 남아 있어야하는 많은 오류에 대해 알 필요가 없습니다. 오류 (잘못된 매개 변수, 로그인 문제, 할당량 제한 등)가 있거나 예기치 않은 오류입니다. 후자의 경우 : 그냥 예기치 않은 오류가 발생했다고. 세부 정보는 개발자에게만 유용하며 개발자는 이미 서버의 오류 로그에 액세스해야합니다.

+0

동의. 그럼에도 불구하고 모든 예외가 [Serializable]으로 표시되고 기본 생성자를 제공하는 것으로 간주되지는 않습니다 (완전히 다른 이유로 예 : 원격)? FxCop은 저에 대해 잔소리를 계속합니다 ... 오라클은 "모범 사례"를 따르지 않고 있습니까? –

+0

@ 인더는'BinaryFormatter'에만 유용합니다; OP는'XmlSerializer'에 대해 묻고 있습니다. –

+0

제가 알고 있습니다. 필자는 오라클이 예외적으로 public no-arg 생성자를 가져야한다고 말하는 디자인 가이드 라인을 따르지 않았기 때문에 이러한 전체적인 문제가 있음을 지적했다. 즉,이 시나리오에서는 클라이언트에 예외를 전달해서는 안된다는 것에 동의합니다. –