DataContract + многомерные массивы Есть ли решение для этого?

Из MSDN:

Допускается комбинирование типов коллекций (наличие коллекций коллекций). Неровные массивы рассматриваются как коллекции коллекций. Многомерные массивы не поддерживаются.

Итак, если вы не можете нормально сериализовать многомерный массив, как можно эффективно обойти это? Я думал о том, чтобы иметь свойство, которое сглаживает массив и сериализует эту коллекцию и снимает сглаживание во время десериализации, но я не уверен, эффективно ли это?

Кто-нибудь нашел решение этого раньше?


Я должен отметить, что причина, по которой я думаю, что сглаживание может работать, заключается в том, что мои размеры являются фиксированным значением (они жестко запрограммированы).


person myermian    schedule 28.10.2011    source источник
comment
Вы можете указать, насколько велики будут эти массивы? И, может быть, как / зачем вы их используете.   -  person Henk Holterman    schedule 28.10.2011


Ответы (3)


Да, вы можете сгладить его или сделать зазубренный, как вам удобнее.

person Henk Holterman    schedule 28.10.2011

Каждый раз, когда вы просматриваете двумерный массив, вы затрачиваете O (n) усилий (или одну «обрабатывающую» единицу на элемент во входных данных). Как вы сказали, не составляет большого труда преобразовать между 2-D и 1-D и обратно. Если вы не имеете дело с действительно большими объемами (размер массива частоты вызовов веб-службы) или с системой с жесткими ограничениями (.Net Compact или .Net Micro Frameworks), я сомневаюсь, что это действительно будет большой проблемой. Такие вещи, как сортировка, становятся дорогими.

       string[,] input = new string[5, 3];
       string[] output = new string[15];

       for (int i = 0; i < input.GetUpperBound(0); i++)
       {
           for (int j = 0; j < input.GetUpperBound(1); j++)
           {
               output[j * input.GetUpperBound(j) + i] = input[i, j];
           }
       }
person jklemmack    schedule 28.10.2011

Возможно, с помощью метода расширения:

public static string[][] Jaggedize(this string[,] input) {
  string[][] output = new string[input.GetLength(0)][];
  for (int i = 0; i < input.GetLength(0); i++) {
    output[i] = new string[input.GetLength(1)];
    for (int j = 0; j < input.GetLength(1); j++) {
      output[i][j] = input[i, j];
    }
  }
  return output;
}
person Andreas    schedule 28.10.2011