2

이 오류와 관련된 여러 게시물을 읽고 내 문제의 해결책을 찾지 못한 경우 여기에서 설명합니다.InvalidOperationException 클래스를 반영하는 오류

XmlSerializer를 사용하여 간단한 클래스를 serialize합니다.

여기 내 코드입니다 : 내가 클릭 xml 파일 생성이 코드

private void btnGenerateXml_Click(object sender, RoutedEventArgs e) 
    { 
     Orchard orchard = new Orchard 
     { 
      Recipe = new Recipe 
      { 
       Name = "Generated by JooWeb.Tools", 
       Author = "admin", 
       ExportUtc = DateTime.UtcNow 
      }, 
      MyDatas = new MyDatas 
      { 
       //Test = "test" 
       TrendDatas = new TrendDatas 
       { 
        Id = null, 
        Status = "Published", 
        TrendDatasPart = new TrendDatasPart 
        { 
         IdSource = 0, 
         PostalCode = "1000", 
         Locality = "Test5", 
         Surface = (decimal)0.00, 
         Price = (decimal)0.00, 
         Type = "", 
         InsertDateIndicator = "", 
         UpdateDateIndicator = "", 
         GetFromDate = DateTime.Now, 
         UpdatedDate = new DateTime(1900, 1, 1) 
        }, 
        CommonPart = new CommonPart 
        { 
         Owner = "/User.UserName=admin", 
         CreatedUtc = DateTime.UtcNow, 
         PublishedUtc = DateTime.UtcNow, 
         ModifiedUtc = DateTime.UtcNow 
        } 
       } 
      } 
     }; 

     XmlSerializer orchardXmlSerializer = new XmlSerializer(typeof(Orchard)); 
     var path = @"C:\Temp\orchardFileImport_" + string.Format("{0:yyyyMMdd}", DateTime.Today) + ".xml"; 
     if (File.Exists(path)) 
      File.Delete(path); 
     orchardXmlSerializer.Serialize(File.OpenWrite(path), orchard); 
     MessageBox.Show("Finished"); 
    } 
} 

[XmlRoot] 
public class Orchard 
{ 
    [XmlElement] 
    public Recipe Recipe { get; set; } 
    [XmlElement(ElementName = "Data")] 
    public MyDatas MyDatas { get; set; } 
} 

public class Recipe 
{ 
    [XmlElement] 
    public string Name { get; set; } 
    [XmlElement] 
    public string Author { get; set; } 
    [XmlElement] 
    public DateTime ExportUtc { get; set; } 
} 

public class MyDatas 
{ 
    public MyDatas() 
    { 

    } 

    //[XmlElement] 
    //public string Test { get; set; } 

    [XmlElement] 
    public TrendDatas TrendDatas { get; set; } 
} 

public class TrendDatas 
{ 
    [XmlAttribute] 
    public string Status { get; set; } 
    [XmlAttribute] 
    public int? Id { get; set; } 
    //[XmlIgnore] 
    [XmlElement] 
    public TrendDatasPart TrendDatasPart { get; set; } 
    //[XmlIgnore] 
    [XmlElement] 
    public CommonPart CommonPart { get; set; } 
} 

public class TrendDatasPart 
{ 
    [XmlAttribute] 
    public int IdSource { get; set; } 
    [XmlAttribute] 
    public string PostalCode { get; set; } 
    [XmlAttribute] 
    public string Locality { get; set; } 
    [XmlAttribute] 
    public decimal Surface { get; set; } 
    [XmlAttribute] 
    public decimal Price { get; set; } 
    [XmlAttribute] 
    public string Type { get; set; } 
    [XmlAttribute] 
    public string InsertDateIndicator { get; set; } 
    [XmlAttribute] 
    public string UpdateDateIndicator { get; set; } 
    [XmlAttribute] 
    public DateTime GetFromDate { get; set; } 
    [XmlAttribute] 
    public DateTime UpdatedDate { get; set; } 
} 

public class CommonPart 
{ 
    [XmlAttribute] 
    public string Owner { get; set; } 
    [XmlAttribute] 
    public DateTime CreatedUtc { get; set; } 
    [XmlAttribute] 
    public DateTime PublishedUtc { get; set; } 
    [XmlAttribute] 
    public DateTime ModifiedUtc { get; set; } 
} 

, 나는 유형을 반영하는 오류가 발생했습니다 오류 InvalidOperationException이 있어 'MergeExcelFiles.Orchard'. { "MyDatas 속성을 반영하는 동안 오류가 발생했습니다."}

내 의견에 표시되는 것처럼,이 변경 사항과 함께 xmlElement 문자열을 노드 MyDatas에 추가하려고합니다. 오류는 없지만 XML 파일 Data라는 이름의 노드가 없습니다.

레시피 클래스가 모두 올바르게 보이지만 노드 MyDatas가 xml 파일에 아무것도 표시되지 않았거나이 오류 "InvalidOperationException"이 표시되는 이유를 모르겠습니다.

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+0

감사합니다. 존 – Jerome2606

답변

5

당신은 이유는 가장 안쪽의 예외가 있기 때문에 더 오류 메시지 파고해야합니다

System.InvalidOperationException : 유형 System.Nullable`1 [선택 System.Int32]의 멤버 '이드'직렬화 할 수 없습니다 . XmlAttribute/XmlText는 복잡한 형식을 인코딩하는 데 사용할 수 없습니다.

문제

는 속성으로 직렬화되는 속성 ( TrendDatas.Id)와 같은 널 (NULL) 값 유형을 가지고 XmlSerializer 잘 이들을 처리하지 않는다는 것입니다. herehere으로 나열된 여러 가지 해결 방법이 있습니다. 그들 중 누구도 특별히 우아하지 않습니다. 가장 좋은 방법은 요소에 Id의 정의를 변경 될 수 있습니다

public class TrendDatas 
{ 
    // ... snip ... 

    [XmlElement(IsNullable = true)] 
    public int? Id { get; set; } 

    public bool ShouldSerializeId() { return Id.HasValue; } 

    // ... snip ... 
} 

ShouldSerializeId는, 관례, 시리얼 라이저는 속성이 출력에 연재해야하는지 결정하기 위해 사용하는 방법이다. 널 값의 경우, 요소는 직렬화 된 출력에 정의되지 않습니다.