Сериализация зубчатых и многомерных массивов

У меня есть object типа Array (то есть object.GetType().IsArray возвращает true). Мой вопрос в том, как я могу узнать, является ли он зубчатым или многомерным массивом? Есть ли способ сериализовать массив, чтобы код «не знал» разницы (используя отражение)?

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

Для зубчатого массива кажется достаточно простым взять массив, а затем продолжить индексировать его, используя [] для перебора всех элементов, однако этот подход не работает для многомерных массивов.


person nickolayratchev    schedule 10.05.2013    source источник
comment
вы пишете собственный механизм сериализации? почему бы не использовать один из нескольких вариантов, встроенных в .net framework?   -  person Robert Levy    schedule 10.05.2013
comment
В основном это обучающее упражнение :)   -  person nickolayratchev    schedule 10.05.2013
comment
Попробуйте изучить параметры настройки DataContractSerializer.   -  person Saravanan    schedule 10.05.2013


Ответы (1)


Зубчатый массив — это массив массивов. Итак, все, что вам нужно сделать, это посмотреть на тип элемента и убедиться, что это тоже массив:

    static bool IsJaggedArray(object obj) {
        var t = obj.GetType();
        return t.IsArray && t.GetElementType().IsArray;
    }

    static void Test() {
        var a1 = new int[42];
        Debug.Assert(!IsJaggedArray(a1));
        var a2 = new int[4, 2];
        Debug.Assert(!IsJaggedArray(a2));
        var a3 = new int[42][];
        Debug.Assert(IsJaggedArray(a3));
    }

Приведите к массиву и используйте свойство Rank, чтобы найти количество измерений для многомерного массива.

person Hans Passant    schedule 10.05.2013
comment
Я понял, что также могу использовать Array.Rank, чтобы определить, является ли массив многомерным (для чего Rank > 1 верно). Это прекрасно работает, спасибо! - person nickolayratchev; 11.05.2013