2

После чтения кратких сообщений, связанных с этой ошибкой, и не нашел решения моей проблемы, я объясню это здесь.InvalidOperationException Error Отражающий класс

Я использую XmlSerializer для сериализации простых классов.

Вот мой код:

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

С помощью этого кода, когда я нажимаю на Сформировать файл XML, я получил InvalidOperationException ошибки Была ошибка типа, отражающую «MergeExcelFiles.Orchard». {«Произошла ошибка, отражающая свойство« MyDatas ».»}

Как вы видите в моих комментариях, я пытаюсь просто добавить строку xmlElement в узел MyDatas, с этим изменением у меня нет ошибки, но в файле xml У меня нет узла с именем Data.

Я не понимаю, почему с классом Recipe все выглядит правильно, но с узлом MyDatas ничего не отображается в XML-файле или не получена эта ошибка «InvalidOperationException».

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Хорошо спасибо Джон – Jerome2606

ответ

5

Вы должны вырыть в сообщение об ошибке больше, потому что причина заключается в сокровенном исключении:

System.InvalidOperationException: Невозможно сериализовать член «Id» типа System.Nullable`1 [System.Int32] , XmlAttribute/XmlText не может использоваться для кодирования сложных типов.

Вопрос заключается в том, что у вас есть обнуляемого тип значения, как свойство (TrendDatas.Id) сериализовать в качестве атрибута и XmlSerializer не обрабатывает их хорошо. Существует ряд обходных решений, перечисленных here и here. Ни один из них не является особенно элегантным. Лучший вариант может изменить определение Id к элементу:

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

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

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

    // ... snip ... 
} 

ShouldSerializeId является метод, который, по соглашению, сериализатор использует, чтобы решить, если свойство должно быть сериализовать на выходе. В случае нулевого значения ни один элемент не будет определен в сериализованном выходе.

 Смежные вопросы

  • Нет связанных вопросов^_^