Hoy me encontré con un problema inesperado al tratar de serializar/deserializar un DataContract que contiene un bool [,] DataMember. Ni el csc ni el tiempo de ejecución objetaban esta definición, sin embargo, los valores en el booleador deserializado [,] DataMember simplemente no eran correctos. Después de leer this thread, mi reacción inicial fue convertir la propiedad problemática en una matriz dentada. Tuve que abandonar ese enfoque pronto, sin embargo, desde this article informa que las matrices irregulares funcionan miserablemente cuando se accede en diagonal o aleatoriamente (exactamente mi caso de uso). Así que terminé escribiendo una versión curada de la solución propuesta en el hilo msdn anterior (convertir rectangular a irregular y viceversa al exportar/importar, ver fragmentos de código a continuación) y que funciona bien.DataContractSerializer no admite matrices rectangulares
public object GetDeserializedObject(object obj, Type targetType)
{
if (obj is GridArrayWrapper)
{
bool[,] arr;
GridArrayWrapper wrapper = (GridArrayWrapper)obj;
if (wrapper.Array == null) return null;
int d0 = wrapper.Array.Length;
if (d0 == 0)
{
return new bool[0, 0];
}
var d1 = wrapper.Array[0].Length;
arr = new bool[d0, d1];
for (int i = 0; i < d0; i++)
{
if (wrapper.Array[i].Length != d1) throw new ArgumentException("Not a rectangular array");
for (var j = 0; j < d1; j++)
{
arr[i, j] = wrapper.Array[i][j];
}
}
return arr;
}
return obj;
}
public object GetObjectToSerialize(object obj, Type targetType)
{
if (obj is bool[,])
{
bool[,] arr = (bool[,])obj;
GridArrayWrapper wrapper = new GridArrayWrapper();
int d0 = arr.GetLength(0);
int d1 = arr.GetLength(1);
wrapper.Array = new bool[d0][];
for (int i = 0; i < wrapper.Array.Length; i++)
{
wrapper.Array[i] = new bool[d1];
for (int j = 0; j < d1; j++)
{
wrapper.Array[i][j] = arr[i, j];
}
}
return wrapper;
}
return obj;
}
Me pregunto, sin embargo, si hay una solución más concisa a este u otro enfoque.
"que las matrices dentadas funcionan de manera miserable", pero ¿eso realmente importa en comparación con la E/S, la conversión y la serialización? –
El formato de persistencia y el formato de tiempo de ejecución no tienen que ser los mismos –
En el núcleo de la aplicación, la matriz en cuestión se accede millones de veces (y es una aplicación de teléfono donde las CPU no son tan potentes). La serialización solo tiene lugar cuando la aplicación se desactiva o se cierra (poco frecuente). – javvin