xmlattribute - xml serialization c#
Serializar una matriz de enteros utilizando XmlSerializer (2)
Lea las excepciones internas:
- Hubo un error que refleja el tipo ''SomeType''. No se puede serializar el miembro ''SomeType.Data'' de tipo ''System.Int32 [,,]'', consulte la excepción interna para obtener más detalles.
- No se puede serializar objeto del tipo System.Int32 [,,]. Las matrices multidimensionales no son compatibles.
Entonces no: las matrices multidimensionales simplemente no son compatibles. Puede que tenga que pasarlo como una matriz de una sola dimensión ... puede hacerlo teniendo una propiedad separada que haga 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 */ }
}
Me encuentro con un problema al tratar de serializar una matriz multidimensional de enteros a través de XmlSerializer para un proyecto XNA en el que estoy trabajando. Soy capaz de serializar todos mis otros datos (booleanos, cadenas, incluso colores, etc.) sin ningún problema. También he visto a muchas personas afirmar que XmlSerializer gestionará de forma nativa (unidimensionales) matrices de enteros también. ¿Existe alguna limitación con respecto a las matrices multidimensionales, o está sucediendo algo más aquí?
Aquí está el código relevante:
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 "Se produjo una excepción no controlada del tipo ''System.InvalidOperationException'' en System.Xml.dll. Hubo un error al generar el documento XML."
También intenté usar esta matriz como una variable miembro en una estructura (donde se almacenan todos mis datos de jugador) pero obtengo la misma excepción al hacer las cosas de esa manera, lo que me lleva a pensar que no es una error de sintaxis simple o algo así.
¿Necesito reestructurar mi código para serializarlo a través de una matriz de una dimensión, o hay algo que estoy pasando por alto?
¡Gracias por adelantado!
Me tomó un tiempo descubrir qué debería pasar Marc''s get y establecer llaves para aplanar y expandir matrices multidimensionales.
Aquí está mi solución para matrices 2D.
En mi caso, sé en tiempo de compilación que una de las dimensiones es 4, así que no tuve 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;
}