Сериализация массива целых чисел с использованием XmlSerializer - PullRequest
4 голосов
/ 16 февраля 2009

Я столкнулся с проблемой при попытке сериализовать многомерный массив целых чисел через XmlSerializer для проекта XNA, над которым я работаю. Я могу сериализовать все мои другие данные (логические, строки, даже цвета и т. Д.) Без помех. Я также видел множество людей, которые утверждают, что XmlSerializer будет также обрабатывать (одномерные) массивы целых чисел. Есть ли ограничения в отношении многомерных массивов или здесь что-то еще происходит?

Вот соответствующий код:

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

Полученное исключение: «Необработанное исключение типа« System.InvalidOperationException »произошло в System.Xml.dll. Произошла ошибка при создании документа XML.»

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

Нужно ли мне реструктурировать мой код для сериализации через одномерный массив, или я что-то пропускаю?

Заранее спасибо!

Ответы [ 2 ]

12 голосов
/ 16 февраля 2009

Чтение внутренних исключений:

  • Произошла ошибка при отображении типа SomeType. Невозможно сериализовать член SomeType.Data типа System.Int32 [,,], см. Внутреннее исключение для получения дополнительной информации.
  • Невозможно сериализовать объект типа System.Int32 [,,]. Многомерные массивы не поддерживаются.

Так что нет: многомерные массивы просто не поддерживаются. Возможно, вам придется пролистать его как одномерный массив ... вы можете сделать это с помощью отдельного свойства, которое выполняет перевод:

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

[XmlElement("Data"), Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public int[] DataDto
{
    get { /* flatten from Data */ }
    set { /* expand into Data */ }
} 
0 голосов
/ 27 марта 2017

Мне потребовалось некоторое время, чтобы выяснить, что следует использовать для получения Марка и установить фигурные скобки для выравнивания и расширения многомерных массивов.

Вот мое решение для 2D массивов.

В моем случае, во время компиляции я знаю, что одним из измерений является 4, поэтому мне не пришлось (как-то) сохранять размеры массива.

    [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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...