Pregunta

Estoy encontrando un problema al intentar serializar una matriz de múltiples dimensiones de enteros a través de XmlSerializer para un proyecto XNA que estoy trabajando. Soy capaz de serializar todos mis otros datos (booleanos, cadenas, incluso los colores, etc.) sin ningún problema. También he visto un montón de personas que afirman que XmlSerializer de forma nativa manejar matrices (de un solo acotado) de números enteros también. ¿Existe una limitación en cuanto matrices de varias dimensiones, o es otra cosa pasando aquí?

Aquí está el código correspondiente:

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(); 

La excepción que recibo es "una excepción no controlada del tipo 'System.InvalidOperationException' en System.Xml.dll. Hubo un error generar el documento XML."

También he intentado usar esta matriz como una variable miembro en una estructura (donde se almacenan todos los datos de mi otro jugador) pero me da la misma excepción al hacer las cosas de esa manera, así, lo que me lleva a creer que que no es un simple error de sintaxis o algo por el estilo.

¿Es necesario reestructurar mi código para serializar a través de un sobredimensionado sola matriz, o hay algo que yo estoy pasando por alto?

Gracias de antemano!

¿Fue útil?

Solución

Leer los interno-excepciones:

  • Se produjo un error que refleja el tipo 'SomeType'. No se puede serializar miembro SomeType.Data 'del tipo 'System.Int32 [,,]', ver excepción interna para más detalles.
  • No se puede serializar objeto de tipo System.Int32 [,,]. Las matrices multidimensionales no son compatibles.

Así que no: matrices multidimensionales simplemente no son compatibles. Puede que tenga que calce a través de una matriz de una sola dimensión ... que puede hacer esto por tener una propiedad independiente que hace la traducción:

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

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

Otros consejos

Me tomó un tiempo para averiguar qué debe entrar get de Marc y establecer apoyos para aplanar y ampliar matrices multidimensionales.

Aquí está mi solución para las matrices 2D.

En mi caso, sé que en tiempo de compilación que una de las dimensiones es de 4, así que no tienen que almacenar (de alguna manera) las dimensiones de la matriz.

    [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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top