1

XML генерируется и загружается одним и тем же .NET с настольным приложением C# с использованием XMLSerialize сериализации/десериализации.Deserialization работает, но XMLArray отсутствует C# XMLSerialize

Сериализуемый класс structur является тихим комплексом, поэтому я просто сделал выбор из двух соответствующих классов.

Теперь, когда я десериализации, все загружается за исключением Mapping сообщения (или сообщения о том, как список объектов называется в Организации.

ли кто-нибудь есть объяснение такого поведения?

Любые советы . или намеки на улучшение того, что уже было сделано также всегда ценится

Спасибо

у меня есть следующий XML:.

<?xml version="1.0" encoding="utf-8"?> 
<configuration xmlns:xsd="Company.Test3.Crm.Crm2Queue.Config.xsd"> 
    <organizations> 
     <organization name="Vanilla"> 
      <settings> 
       <ignoreemptyfields>true</ignoreemptyfields> 
       <throwerroronmissingconfiguration>true</throwerroronmissingconfiguration> 
      </settings> 
      <endpoints> 
       <endpoint> 
        <serviceUri>http://www.webservicex.net/usaddressverification.asmx</serviceUri> 
       </endpoint> 
      </endpoints> 
      <messages> 
       <message name="account"> 
        <field name="accountnumber" mappedname="State" /> 
        <field name="address1_county" mappedname="Zip" /> 
        <field name="address1_latitude" mappedname="City" /> 
       </message> 
      </messages> 
      <entities> 
       <entity name="account" messageschema="/XSD/.xsd" identifier="accountid"> 
        <events> 
         <event name="create" message="" /> 
         <event name="update" message="" /> 
         <event name="delete" message="" /> 
        </events> 
       </entity> 
      </entities> 
     </organization> 
    </organizations> 
</configuration> 

Теперь сериализации класс выглядит следующим образом:

[Serializable()] 
public class Organization 
{ 
    #region XmlIgnore 

    [XmlIgnore()] 
    public string Id { get; set; } 

    [XmlIgnore()] 
    public bool Checked { get; set; } 

    [XmlIgnore()] 
    public List<MappingMessage> mappingMessages { get; set; } 

    #endregion 

    #region Attributes 

    [XmlAttribute("name")] 
    public string Name { get; set; } 

    #endregion 

    #region Properties 

    [XmlElement("settings")] 
    public Settings Settings { get; set; } 
    public bool ShouldSerializeSettings() { return (Settings != null && (Settings.IgnoreEmptyFields.HasValue || Settings.ThrowErrorOnMissingConfiguration.HasValue)); } 

    [XmlArray("endpoints")] 
    [XmlArrayItem("endpoint")] 
    public List<Endpoint> Endpoints { get; set; } 
    public bool ShouldSerializeignoreEndpoints() { return (Endpoints.Count > 0); } 

    [XmlArray("messages")] 
    [XmlArrayItem("message")] 
    public List<MappingMessage> Messages 
    { 
     get { return mappingMessages.Where(mm => (mm.Fields.Where(fi => !string.IsNullOrEmpty(fi.MappedName)).ToList().Count > 0)).ToList(); } 
     set { mappingMessages = value; } 
    } 
    public bool ShouldSerializeFilledMappingMessages() { return (mappingMessages.Where(mm => (mm.Fields.Where(fi => !string.IsNullOrEmpty(fi.MappedName)).ToList().Count > 0)).ToList().Count > 0); } 
    //public bool ShouldSerializeMappingMessages() { return (MappingMessages.Where(mm=> (mm.Fields.Where(fi=> !string.IsNullOrEmpty(fi.MappedName)).ToList().Count > 0)).ToList().Count > 0); } 

    [XmlArray("entities")] 
    [XmlArrayItem("entity")] 
    public List<Entity> Entities { get; set; } 
    public bool ShouldSerializeEntities() { return (Entities.Count > 0); } 

    #endregion 

    #region Constructors 

    public Organization() 
    { 
     Settings = new Settings(); 
     Endpoints = new List<Endpoint>(); 
     mappingMessages = new List<MappingMessage>(); 
     Entities = new List<Entity>(); 
     Checked = false; 
    } 

    public Organization(string name) 
     : this() 
    { 
     Name = name; 
    } 

    public Organization(string id, string name) 
     : this(name) 
    { 
     Id = id; 
    } 

    #endregion 
} 


[Serializable()] 
public class MappingMessage 
{ 
    #region XmlIgnore 

    [XmlIgnore()] 
    public string EntityId { get; set; } 


    [XmlIgnore()] 
    public bool Checked { get; set; } 

    [XmlIgnore()] 
    public List<Field> Fields { get; set; } 

    #endregion 

    #region Attributes 

    [XmlAttribute("id")] 
    public string Id { get; set; } 

    [XmlAttribute("name")] 
    public string Name { get; set; } 

    #endregion 

    #region Properties 

    [XmlElement("field")] 
    public List<Field> SelectedFields 
    { 
     get 
     { 
      return Fields.Where(fi=> !string.IsNullOrEmpty(fi.MappedName)).ToList(); 
     } 
     set 
     { 
      Fields = value; 
     } 
    } 
    public bool ShouldSerializeSelectedFields() { return (SelectedFields.Count > 0); } 

    [XmlElement("subentity")] 
    public List<SubEntity> SubEntities { get; set; } 
    public bool ShouldSerializeSubEntities() { return (SubEntities.Count > 0); } 

    [XmlElement("parententity")] 
    public List<ParentEntity> ParentEntities { get; set; } 
    public bool ShouldSerializeParentEntities() { return (ParentEntities.Count > 0); } 

    #endregion 

    #region Constructors 

    public MappingMessage() 
    { 
     Checked = false; 
     Fields = new List<Field>(); 
     SubEntities = new List<SubEntity>(); 
     ParentEntities = new List<ParentEntity>(); 
    } 

    public MappingMessage(string entityId) 
     : this() 
    { 
     EntityId = entityId; 
    } 

    public MappingMessage(string entityId, string name) 
     : this(entityId) 
    { 
     Name = name; 
    } 

    #endregion 
} 

И я использую десериализации, как показано ниже:

foreach (ZipEntry zipEntry in zipFile) 
       { 
        using (MemoryStream memoryStream = new MemoryStream()) 
        { 
         if (zipEntry.FileName.ToLower().EndsWith(".crm.crm2queue.config.xml")) 
         { 
          using (StreamReader streamReader = new StreamReader(memoryStream, Encoding.UTF8)) 
          { 
           zipEntry.Extract(memoryStream); 
           memoryStream.Position = 0; 
           XmlSerializer xmlSerializer = new XmlSerializer(typeof(Ciber.Crm.MappingCRMTo.Data.Configuration)); 
           configuration = (Configuration)xmlSerializer.Deserialize(streamReader); 
          } 
         } 
        } 
       } 

ответ

1

десериализатор пытается заполнить список Returne public List<MappingMessage> Messages. Чтобы сериализатор вызывал установщик, вы должны изменить тип свойства на неизменный тип коллекции, например MappingMessage[].

Редактировать: чтобы увидеть, что вы можете заменить автоматическое свойство Entities свойством с помощью поля поддержки и установить точку останова как в getter, так и в setter. Вы не должны ломать сеттера, только в геттере.

+0

Я действительно уже подтвердил, что сеттер не называется, что имеет смысл для меня сейчас. Сейчас он отлично работает, спасибо за помощь. –

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