Сериализация XML и переносимость MS / Mono - PullRequest
2 голосов
/ 18 мая 2010

Я пытаюсь сериализовать классы, используя среду выполнения MS и Mono. При использовании MS runtime все идет хорошо, но при использовании Mono я даю некоторые исключения и запускаю программу.

Выдается следующее исключение:

  • Произошла ошибка, отражающая тип: System.TypeInitializationException (класс)
  • Произошла ошибка, отражающая тип: System.InvalidOperationException (класс)
  • Произошла ошибка при отражении поля: System.ArgumentOutOfRangeException <0 (массив классов) </li>

Двоичный файл был скомпилирован с использованием MS SDK, но я не думаю, что это проблема.

Что происходит? .NET не должен быть портативным? Как решить эти исключения?


Я установил MONO для Windows, установил Monodevelop (просто ради) и получил те же проблемы. Вот класс, который вызывает проблемы:

[XmlInclude(typeof(XmlServiceVersion))]
[XmlInclude(typeof(XmlUserLogin))]
[XmlInclude(typeof(XmlNetService))]
[XmlInclude(typeof(XmlUserList))]
[XmlInclude(typeof(XmlGroupList))]

public class XmlMessage
{
            ...


    [XmlAttribute]
    public XmlMessageCode Code = XmlMessageCode.Invalid;

    [XmlAttribute]
    public XmlMessageError Error = XmlMessageError.None;

    public Object Contents = null;

    private static XmlSerializer mXmlSerialize = new XmlSerializer(typeof(XmlMessage));

}

Текст исключения, в частности:

Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for iGecko.XmlClientConfiguration ---> System.TypeInitializationException: An exception was thrown by the type initializer for iGecko.Net.XmlMessageClient ---> System.InvalidOperationException: There was an error reflecting type 'iGecko.Net.XmlMessage'. ---> System.InvalidOperationException: There was an error reflecting type 'iGecko.Net.XmlProcessList'. ---> System.InvalidOperationException: There was an error reflecting field 'Items'. ---> System.ArgumentOutOfRangeException: Cannot be negative.
Parameter name: length

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


Обновление

Извините за «грандиозное» редактирование, но я начинаю понимать ошибку. XmlMessage содержит открытое поле Object, которому может быть присвоен класс XmlProcessList, производный от класса, описанного в этом посте ( XmlDictionary ), который определяет поле Items.

Ответы [ 2 ]

3 голосов
/ 11 октября 2012

У меня была такая же проблема с вложенными универсальными типами.Следующий класс выдает точно такое же исключение в Mono, пока работает в .NET:

[Serializable]
public class SerializableDictionary<TKey, TValue>
{
    /// <summary>
    /// List of serializable dictionary entries.
    /// </summary>
    [XmlElement("Entry")]
    public List<KeyAndValue<TKey, TValue>> Entries { get; set; }

    /// <summary>
    /// Serializable key-value pair.
    /// </summary>
    [Serializable]
    public class KeyAndValue
    {
        /// <summary>
        /// Key that is mapped to a value.
        /// </summary>
        public TKey Key { get; set; }

        /// <summary>
        /// Value the key is mapped to.
        /// </summary>
        public TValue Value { get; set; }
    }
}

, тогда как работает следующий:

[Serializable]
public class SerializableDictionary<TKey, TValue>
{
    /// <summary>
    /// List of serializable dictionary entries.
    /// </summary>
    [XmlElement("Entry")]
    public List<KeyAndValue<TKey, TValue>> Entries { get; set; }

    /// <summary>
    /// Serializable key-value pair.
    /// </summary>
    [Serializable]
    public class KeyAndValue<TKey, TValue>
    {
        /// <summary>
        /// Key that is mapped to a value.
        /// </summary>
        public TKey Key { get; set; }

        /// <summary>
        /// Value the key is mapped to.
        /// </summary>
        public TValue Value { get; set; }
    }
}

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

3 голосов
/ 18 мая 2010

Попробуйте запустить приложение через MoMA (анализатор миграции Mono) - в нем должно быть указано, какие методы, которые вы используете, Mono не поддерживает, и любые потенциальные проблемы миграции (например, создание путей без использования Path.Combine) .

...