Domanda

Sto incontrando un problema durante il tentativo di serializzare un array multi-dimensionato di interi tramite XmlSerializer per un progetto XNA su cui sto lavorando. Sono in grado di serializzare tutti i miei altri dati (booleani, stringhe, anche i colori, ecc) senza intoppi. Ho visto anche un sacco di persone sostengono che XmlSerializer sarà nativamente di gestire array (single-quotato) di interi pure. C'è una limitazione per quanto riguarda gli array multi-dimensionato, o è qualcos'altro succedendo qui?

Ecco il codice in questione:

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'eccezione che ricevo è "un'eccezione non gestita di tipo 'System.InvalidOperationException' in System.Xml.dll. C'è stato un errore durante la generazione del documento XML".

Inoltre ho provato ad utilizzare questo array come una variabile membro in una struttura (dove tutti i miei altri dati giocatore viene memorizzata), ma ho la stessa eccezione quando fare le cose in questo modo, così, il che mi porta a credere che non è un semplice errore di sintassi o qualcosa di simile.

Devo ristrutturare il mio codice per serializzare tramite una matrice di singolo-dimensionato, o c'è qualcosa che mi si affaccia?

Grazie in anticipo!

È stato utile?

Soluzione

Leggi le interno-eccezioni:

  • C'è stato un errore di tipo riflettente 'SomeType'. Impossibile serializzare membro 'SomeType.Data' di tipo 'System.Int32 [,,]', vedere l'eccezione interna per maggiori dettagli.
  • Non è possibile serializzare oggetto di tipo System.Int32 [,,]. Gli array multidimensionali non sono supportate.

Quindi no: array multidimensionali semplicemente non sono supportati. Potrebbe essere necessario spessorare attraverso come un array monodimensionale ... si può fare questo avendo una proprietà separata che fa la traduzione:

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

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

Altri suggerimenti

Mi c'è voluto un po 'per capire cosa deve andare in get di Marc e impostare bretelle per appiattire ed espandere gli array multidimensionali.

Qui è la mia soluzione per gli array 2D.

Nel mio caso, io so al momento della compilazione che una delle dimensioni è 4, quindi non c'era bisogno di memorizzare (in qualche modo) le dimensioni di matrice.

    [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;
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top