2009-02-16 16 views
4

Je rencontre un problème lors de la tentative de sérialisation d'un tableau multidimensionnel d'entiers via XmlSerializer pour un projet XNA sur lequel je travaille. Je suis en mesure de sérialiser toutes mes autres données (booléens, chaînes de caractères, même couleurs, etc) sans accroc. J'ai aussi vu beaucoup de gens prétendre que XmlSerializer gérera nativement des tableaux d'entiers (unidimensionnels). Existe-t-il une limitation concernant les tableaux multidimensionnels, ou y a-t-il autre chose ici?Sérialisation d'un tableau d'entiers à l'aide de XmlSerializer

Voici le code correspondant:

int[,,] scoredata = scores; // Populated with data elsewhere 

filename = Path.Combine(container.Path, "scoredata.sav"); 
stream = File.Open(filename, FileMode.Create); 
serializer = new XmlSerializer(typeof(int[,,])); 
serializer.Serialize(stream, scoredata); // This line throws the exception. 
stream.Close(); 

L'exception que je reçois est "Une exception non gérée du type 'System.InvalidOperationException' a eu lieu en System.Xml.dll Il y avait une erreur générer le document XML.". J'ai aussi essayé d'utiliser ce tableau comme une variable membre dans une structure (où toutes les données de mes autres joueurs sont stockées) mais j'ai la même exception quand je fais des choses comme ça, ce qui me fait croire que ce n'est pas une simple erreur de syntaxe ou quelque chose comme ça. Ai-je besoin de restructurer mon code pour le sérialiser via un tableau à une seule dimension, ou y a-t-il quelque chose que je néglige?

Merci d'avance!

Répondre

12

Lire les quartiers défavorisés des exceptions:

  • Il y avait une erreur du type réfléchissant 'UnType'. Impossible de sérialiser le membre 'SomeType.Data' du type 'System.Int32 [,,]', voir l'exception interne pour plus de détails.
  • Impossible de sérialiser un objet de type System.Int32 [,,]. Les tableaux multidimensionnels ne sont pas pris en charge.

Donc non: les tableaux multidimensionnels ne sont tout simplement pas pris en charge. Vous devrez peut-être shim à travers une gamme unique dimension ... vous pouvez le faire en ayant une propriété séparée qui fait la traduction:

[XmlIgnore] 
public int[, ,] Data { get; set; } 

[XmlElement("Data"), Browsable(false)] 
[EditorBrowsable(EditorBrowsableState.Never)] 
public int[] DataDto 
{ 
    get { /* flatten from Data */ } 
    set { /* expand into Data */ } 
} 
+0

C'est une sorte de réponse à laquelle je m'attendais. Je vous remercie! – CloudyMusic

0

Il m'a fallu un certain temps pour comprendre ce qui devrait aller dans de Marc obtenir et définir des accolades pour aplatir et étendre les tableaux multidimensionnels.

Voici ma solution pour les tableaux 2D. Dans mon cas, je sais au moment de la compilation que l'une des dimensions est 4, donc je n'ai pas eu besoin de stocker (en quelque sorte) les dimensions du tableau.

[XmlIgnore] 
    public int[,] Readings { get; set; } 
    [XmlArray("Readings")] 
    public int[] ReadingsDto { 
     get { return Flatten(Readings); } 
     set { Readings = Expand(value, 4); } 
    } 

    public static T[] Flatten<T>(T[,] arr) 
    { 
     int rows0 = arr.GetLength(0); 
     int rows1 = arr.GetLength(1); 
     T[] arrFlattened = new T[rows0 * rows1]; 
     for (int j = 0; j < rows1; j++) 
     { 
      for (int i = 0; i < rows0; i++) 
      { 
       var test = arr[i, j]; 
       arrFlattened[i + j * rows0] = arr[i, j]; 
      } 
     } 
     return arrFlattened; 
    } 
    public static T[,] Expand<T>(T[] arr, int rows0) 
    { 
     int length = arr.GetLength(0); 
     int rows1 = length/rows0; 
     T[,] arrExpanded = new T[rows0, rows1]; 
     for (int j = 0; j < rows1; j++) 
     { 
      for (int i = 0; i < rows0; i++) 
      { 
       arrExpanded[i, j] = arr[i + j * rows0]; 
      } 
     } 
     return arrExpanded; 
    }