2010-06-09 1 views
0

메시지를 처리하는 응용 프로그램이 있다고 가정 해 보겠습니다. 메시지는 IMessage 인터페이스를 구현하는이 경우의 개체입니다. 이는 단지 표식입니다..NET에서 감사/로깅 목적으로 개체를 serialize하기위한 전략은 무엇입니까?

이 응용 프로그램에서 메시지가 처리되지 않으면 먼저 감사 및 문제 해결을 위해 먼저 기록하고 싶습니다. 둘째로 나는 그것을 재 처리를 위해 사용하고 싶을지도 모른다.

이상적으로는 메시지를 사람이 읽을 수있는 형식으로 직렬화해야합니다. 첫 번째 후보는 JSON과 같은 것이 있지만 XML입니다. 메시지를 XML로 직렬화하려면 메시지 객체가 XML 직렬화 가능 여부를 알고 싶습니다. 한 가지 방법은 형식을 반영하고 매개 변수가없는 생성자가 있는지 확인하고 다른 하나는 IXmlSerializable 인터페이스가 필요한지 확인하는 것입니다. 나는이 접근법 중 하나에 너무 만족하지 않습니다. 그것을 직렬화하고 예외를 잡으려고하는 세 번째 옵션이 있습니다. 이것은 실제로 도움이되지 않습니다. - 어떤 식 으로든, 어떤 식 으로든, IMessage (또는 파생 된 유형)은 xml-serializable이어야합니다.

반사 경로는 IXmlSerializable 경로 잠금 미래에 내가 JSON으로 직렬화 형식을 변경할 수 있습니다 하나의 포맷, 내 메시지 아래 등의 보안, 성능, 같은 명백한 단점이있다. 다른 것은 심지어 가장 단순한 객체 일지라도 ReadXmlWriteXml 메소드를 구현해야합니다.

임의의 개체 (마커 인터페이스를 구현하는 한)를 XML로 직렬화 할 수 있지만 향후 메시지를 XML로 잠그지 않는 작업량이 가장 적은 경로가 있습니까?

+0

이것이 실제 문제가 될 수 있음을 알기가 어렵습니다. 디자인을 통하지 않으면 디버깅 할 때 클래스가 직렬화 가능하지 않다는 것을 확실히 알 수 있습니다. –

+1

Xml 직렬화에 매개 변수없는 생성자가 필요하지만 "임의의 객체"의 성공적인 직렬화를 보장하는 것만으로는 충분하지 않습니다. 예 : 개체에 IDictionary와 같이 직렬화 할 수없는 필드가 포함될 수 있습니다. –

+0

정확히 Tuzo - 그 이상이 필요합니다. 이 개체가 Xml 직렬화를위한 것이지만 IXmlSerializable과 같은 것이 ReadXml/WriteXml을 구현하도록 강요하지 않습니다. –

답변

1

매개 변수없는 생성자가 포함 된 모든 메시지 객체가 파생 된 MessageBase를 구현할 수 있습니다. 그런 다음 IMessage 대신 을 사용하십시오.

그러나 메시지를 디자인하고 모든 메시지를 직렬화 할 의도가 있는지 궁금 할지라도 왜 확인해야합니까?

은 여기에 많이 사용하는 일반 객체의 확장이다 :

/// <summary>   
/// Converts an object to a serialized xml string  
/// </summary> 
/// <param name="o">The <see cref="object"/> to serialize</param> 
/// <returns></returns> 
public static string ToXml(this object o) 
{ 
    XmlSerializer xmlSerializer = new XmlSerializer(o.GetType()); 

    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     using (StreamWriter streamWriter = new StreamWriter(memoryStream)) 
     { 
      xmlSerializer.Serialize(streamWriter, o); 
      streamWriter.Flush(); 
      memoryStream.Flush(); 
      memoryStream.Position = 0; 

      using (StreamReader streamReader = new StreamReader(memoryStream)) 
      { 
       return streamReader.ReadToEnd(); 
      } 
     } 
    } 
} 

이 MessageBase에 구현하고 당신은 황금입니다. 아무것도 잠그지 않아.

+1

이제 코드는 serialize하기 위해 MessageBase에 대해 테스트해야합니다. 어떤 종류의 IMessage가 처음입니다. –

+0

그건 그렇고, XML 직렬화를 위해 StringWriter/StringBuilder를 사용합니다. 확실하지 않은 경우 무엇이 있는지, 차이점은 무엇입니까. –

+0

그래. 개인적으로 메서드가없는 인터페이스가 나를위한 목적을 무의미하게 만듭니다. 그것은 당신이 실제로하려고하는 대상과 관련된 어떤 특정한 것을 할 수 있음을 나타내지는 않습니다. 객체에 직렬화에 필요한 메소드가 모두 포함되어 있고 직렬화 할 수있는 적절한 객체로 디자인되었음을 나타냅니다. –

1

그러므로 가능한 한 가장 쉬운 방법으로 사람이 읽을 수있는 형식 (가능하면 XML)으로 임의의 객체 (마커 인터페이스를 구현하는 한 )를 직렬화해야합니다.

Is It Serializable?에서 언급했듯이 객체가 직렬화 가능 여부를 결정하는 것은 어렵습니다.

  1. 가 자신의 사람이 읽을 수있는 형식을 구현하기 위해 iMessage를 인터페이스와 힘 클래스 에 직렬화 방법을 추가 : 내가 요구 사항을 충족하는 경우에만이 방법을 생각 할 수

    .

  2. 사람이 읽을 수있는 형식을 허용하는 서비스로 응용 프로그램 인터페이스를 공개하십시오. 예 : 로그 할 수있는 사람이 읽을 수있는 메시지 (XML) 을 수락하는 WCF 서비스

옵션 1은 감사에는 좋지만 재 처리에는 적합하지 않을 수 있습니다. 또한 문제를 일으킬 수있는 몇 가지 모호한 사례가 있습니다.

기존 응용 프로그램 인 경우 실행 가능한 옵션이 아닐 수 있습니다. 그렇다면 어쩌면 최선의 노력을 기반으로 직렬화하려고 시도하기 위해 Json.NET과 같은 것을보십시오.

관련 문제