La sérialisation C # XML supprime le nom d’élément de tableau irrégulier

J’ai les cours ci-dessous:

public class MainRequest { private Request _dataField; [XmlElementAtsortingbute("Parameters")] public Request Parameters { get { return _dataField; } set { _dataField = value; } } } public class Request { private RequestSize _requestSize; private Field[][] _field; [XmlElementAtsortingbute(IsNullable = true)] public RequestSize RequestSize { get { return _requestSize; } set { _requestSize = value; } } [XmlArrayItem("BatchEntry")] [XmlArrayItemAtsortingbute("ParameterEntry", IsNullable = false, NestingLevel = 1)] public Field[][] Batch { get { return _field; } set { _field = value; } } } public class RequestSize { private ssortingng _count; private ssortingng _value; [XmlAtsortingbuteAtsortingbute] public ssortingng Count { get { return _count; } set { _count = value; } } [XmlTextAtsortingbute] public ssortingng Value { get { return _value; } set { _value = value; } } } public class Field { private ssortingng _fieldName; private ssortingng _fieldValue; [XmlAtsortingbuteAtsortingbute(AtsortingbuteName = "name")] public ssortingng Name { get { return _fieldName; } set { _fieldName = value; } } [XmlTextAtsortingbute] public ssortingng Value { get { return _fieldValue; } set { _fieldValue = value; } } } 

Quand ils sont sérialisés, je reçois:

  2   111 222 333    

J’essaie de me débarrasser de l’élément Batch . Ce que je veux que le xml ressemble à, c’est:

  2  111 222 333   

J’ai essayé d’utiliser l’atsortingbut XmlElement sur le champ [] [] mais je reçois une erreur lorsque je le fais:

 [XmlElement("Batch")] public Field[][] Batch { get { return _field; } set { _field = value; } } Error 97 Cannot convert type 'Field[][]' to 'Field[]' 

Existe-t-il un moyen de sérialiser les éléments du tableau sans ce nom d’élément de niveau supérieur?

Il semble que ce que vous essayez d’accomplir ne soit pas supporté de manière native; il n’y a aucun moyen d’appliquer un atsortingbut XmlElement à un tableau en XmlElement . Voir le bogue XmlSerializer lors de la sérialisation d’une collection de collections sans élément racine?

Cependant, ce que vous pouvez faire est de décomposer votre tableau Field[][] escalier en un tableau simple d’un nouveau type – appelons-le Batch – qui contiendrait à son tour un tableau de votre type Field . Le code suivant génère le code XML que vous recherchez:

 public class MainRequest { [XmlElementAtsortingbute("Parameters")] public Request Parameters { get; set; } } public class Request { [XmlElementAtsortingbute(IsNullable = true)] public RequestSize RequestSize { get; set; } [XmlElement("BatchEntry")] public Batch[] Batches { get; set; } } public class RequestSize { [XmlAtsortingbuteAtsortingbute] public ssortingng Count { get; set; } [XmlTextAtsortingbute] public ssortingng Value { get; set; } } public class Batch { [XmlElementAtsortingbute("ParameterEntry")] public Field[] Fields { get; set; } } public class Field { [XmlAtsortingbuteAtsortingbute(AtsortingbuteName = "name")] public ssortingng Name { get; set; } [XmlTextAtsortingbute] public ssortingng Value { get; set; } } public static void Main(ssortingng[] args) { var request = new MainRequest { Parameters = new Request { RequestSize = new RequestSize { Count = "1", Value = "2", }, Batches = new Batch[] { new Batch { Fields = new Field[] { new Field { Name = "AAA", Value = "111"}, new Field { Name = "BBB", Value = "222"}, new Field { Name = "CCC", Value = "333"}, } } } } }; using (var stream = new MemoryStream()) using (var reader = new StreamReader(stream)) { XmlSerializer serializer = new XmlSerializer(typeof(MainRequest)); serializer.Serialize(stream, request); stream.Seek(0, SeekOrigin.Begin); var str = reader.ReadToEnd(); } } 

XML généré:

    2  111 222 333    

L’avantage de cette approche est que cela fonctionnerait toujours si vous définissiez plusieurs lots. Par exemple:

  var request = new MainRequest { Parameters = new Request { RequestSize = new RequestSize { Count = "2", Value = "5", }, Batches = new Batch[] { new Batch { Fields = new Field[] { new Field { Name = "AAA", Value = "111"}, new Field { Name = "BBB", Value = "222"}, new Field { Name = "CCC", Value = "333"}, } }, new Batch { Fields = new Field[] { new Field { Name = "DDD", Value = "444"}, new Field { Name = "EEE", Value = "555"}, } } } } }; 

… Générerait:

    5  111 222 333   444 555    

Après expérimentation, vous devrez renommer Batch en BatchEntry (vous ne pouvez apparemment pas combiner XmlElement et XmlArrayItem ), puis l’atsortingbut XmlArrayItem avec le nom “ParameterEntry”.

Cela fonctionnera:

 /* No idea why this a 2-d array... It doesn't match your XML */ [XmlArrayItem("ParameterEntry")] public Field[] BatchEntry //was Batch 

Essayez quelque chose comme

  [XmlIgnore] public Field[][] Batch { get { return _field; } set { _field = value; } } [XmlArrayItemAtsortingbute("ParameterEntry", IsNullable = false)] public Field[] BatchEntry { get { List OneDimFields = new List(); foreach(Field[] field in _field) { OneDimFields.AddRange(field); } return OneDimFields.ToArray(); } }