2013-05-30 2 views
1

매개 변수없는 생성자가 없기 때문에 직렬화 할 수 없습니다일렬 예외 - 그것은 내가 <code>XMLSerializer</code>을 초기화 할 때 예외를 얻고합니다 (EWS의 API에서) 그것을 <code>Appointment</code>의 인스턴스를 전달하고있어

Microsoft.Exchange을 .WebServices.Data.Appointment는 매개 변수없는 생성자가 없기 때문에 직렬화 할 수 없습니다. 여기

내 코드입니다 : (삭제 이후)

private static string FindAppointmentsAsXmlString(CalendarView calendar, ExchangeService serv) 
{ 
    FindItemsResults<Appointment> appointments = serv.FindAppointments(
     WellKnownFolderName.Calendar, calendar); 
    List<Appointment> appointmentsList = appointments.ToList(); 

    var serializer = new XmlSerializer(appointmentsList.GetType()); 
    var writer = new StringWriter(); 

    try 
    { 
     serializer.Serialize(writer, appointmentsList); 
     Console.WriteLine(writer.GetStringBuilder().ToString()); 
     Console.ReadLine(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
     Console.ReadLine(); 
    } 

    return writer.GetStringBuilder().ToString(); 
} 
+1

@GrantWinney을 할 수있는 그 날을 데 어떻게 도움이되는지 -이 : – LKB

+0

죄송합니다. 귀하의 것과 거의 같은 오류는 있지만 중요한 한마디 차이가 있습니다 ... 죄송합니다. –

+0

오류나 복사/붙여 넣기를 입력 했습니까? 왜냐하면 _parameterless constructor_ 오류가 발생한다고 들었으나 _parameterized constructor_ 오류에 대해서는 아무것도 찾을 수 없습니다. –

답변

1

내가 위 내 댓글에 post에 링크 된 이유는 상태이다 그 : 객체의 동안

직렬화를 해제 한 클래스는, 직렬화 된 클래스의 인스턴스를 생성 해, 직렬화 된 필드 및 프롭퍼티를 팝하는 인스턴스를 취득한 후에 만 ​​입력하도록 (듯이) 계속 진행합니다 ulate. 당신은 Appointment 생성자에서 ExchangeService의 인스턴스를 필요로하는 Appointment constructor의 문서에서 볼 수

은 ... 어떤 매개 변수가없는 생성자, 따라서 오류가 없습니다.

나는 직렬화 프로세스의 모든 내부 - 동작에 대해 잘 모르지만, 희망이 당신에게 적어도 오류에 대한 이유를 제공합니다. 당신의 자신의 클래스를한다면

일반적으로는, 당신은 단지 추가 (매개 변수없는) 생성자를 추가 할 수 있어야합니다,하지만 난 당신이 경우에는 무엇 확실하지 않다. Appointment 클래스를 성공적으로 직렬화하는 또 다른 방법이있을 수 있지만 잘 모르겠습니다.

당신은 거기에 매개 변수가없는 생성자를 제공하는 Appointment 클래스를 확장하려고하고 XML을 사용하는 것을 직렬화 할 수있다. 나는 그것이 효과가 있을지 모르지만, 아마도 다른 누군가가 좀 더 확실한 답을 줄 수 있습니다.

public class MyAppointment : Appointment 
{ 
    public MyAppointment() { } 
} 

나는 그것에 다른 것을 발견하면, 나는이 업데이트됩니다.

namespace DTO 
    {   
     public class CalendarAppointment : Appointment 
     { 
      public CalendarAppointment() : base(/* any parameters to construct the base appointment, doesn't matter /*) 
      { 
      } 
     } 
} 

다음 당신은 내가하지 않는

private static string FindAppointmentsAsXmlString(CalendarView calendar, ExchangeService serv) 
     { 
      FindItemsResults<Appointment> appointments = serv.FindAppointments(
       WellKnownFolderName.Calendar, calendar); 

      Mapper.CreateMap<Appointment, DTO.CalendarAppointment>(); 

      var list = appointments.Select(Mapper.Map<DTO.CalendarAppointment>).ToList(); 
      var serializer = new XmlSerializer(list.GetType()); 
      var writer = new StringWriter(); 

      try 
      { 
       serializer.Serialize(writer, list); 
       Console.WriteLine(writer.GetStringBuilder().ToString()); 
       Console.ReadLine(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex); 
       Console.ReadLine(); 
      } 

      return writer.GetStringBuilder().ToString(); 
     } 
+0

감사합니다 그랜트, 매우 도움이! 나는 XML 파일에 내용을 쓰고 있는데 Appointment 객체를 직렬화하고 있는데, XML 파일에 객체의 내용을 쓰려면이 예외를 피하면서 다른 방법이 있을까요? – LKB

+0

잘 모르겠습니다, @LBran. A (상대적으로) 최근 포스트]에서 (http://stackoverflow.com/a/9663896/301857), 마크 Gravell 그가 XmlSerializer를위한 직접적인 보충을 인식하지 말한다 ...나는 그의 의견을 믿을 것이다. :) _ (참고로, 나는 그의 "protobuf-net"(http://code.google.com/p/protobuf-net) 프로젝트를 언급하고있는 "빠른 바이너리 프로토콜"을 가정한다. 귀하의 데이터는 사람이 읽을 수 없을 것입니다.) _ –

+0

도움을 주신 것에 감사드립니다. @GrantWinney, 나는 대체 생각을했습니다. 유형 약속 목록을 실행하고 각 노드를 String으로 변환 한 다음 Serialize합니까? 약속을 확장하는 클래스를 구현할 때 결과는 다음과 같습니다. " 'Microsoft.Exchange ... Appointment'에는 0 개의 인수를 사용하는 생성자가 포함되어 있지 않습니다." – LKB