Question

Je rencontre un problème lors de sérialisation d'un tableau à plusieurs dimensions d'entiers via XmlSerializer pour un projet XNA je travaille. Je suis en mesure de sérialisation tous mes autres données (booléens, chaînes, même les couleurs, etc) sans accroc. J'ai aussi vu beaucoup de gens prétendent que XmlSerializer va gérer nativement des tableaux (simple) dimensionnées d'entiers ainsi. Y at-il une limitation en ce qui concerne les tableaux de plusieurs dimensionnées, ou est autre chose se passe ici?

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 un struct (où tous mes autres données du lecteur est stocké) mais je reçois la même exception lorsque vous faites les choses de cette façon, aussi bien, ce qui me porte à croire que ce n'est pas simple erreur de syntaxe ou quelque chose comme ça.

Ai-je besoin de restructurer mon code pour sérialiser via un seul réseau dimensionné, ou est-il quelque chose que je donne sur?

Merci d'avance!

Était-ce utile?

La solution

Lire les quartiers défavorisés des exceptions:

  • Il y avait un type qui reflète l'erreur « UnType ». Impossible de sérialiser membre 'SomeType.Data' de type 'System.Int32 [,,]', voir exception interne pour plus de détails.
  • Impossible de sérialiser objet de type System.Int32 [,,]. Les tableaux multidimensionnels ne sont pas pris en charge.

Donc pas: tableaux multidimensionnels sont tout simplement pas pris en charge. Vous pourriez avoir à ce shim par un ensemble 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 */ }
} 

Autres conseils

Il m'a fallu un certain temps pour comprendre ce qui devrait aller dans le get de Marc et mettre des accolades pour aplatir et développer des réseaux 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 ne fallait pas 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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top