Проблемы XmlSerialization на компактной платформе 3.5 - PullRequest
1 голос
/ 30 августа 2009

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

Теперь я столкнулся с проблемой с сериализацией объектов. Двоичная сепарация не поддерживается .Net Compact Framework, поэтому я выбираю XmlSerialization. Я написал библиотеку с двумя классами. ObjectCarrier, который должен содержать другие классы, чтобы у меня был общий способ отправки и получения. И есть костюм класса MusicAlbum.

Вся установка отлично работает на стороне ПК. Мобильный сайт постоянно выдает мне следующую ошибку: System.InvalidOperationException: при создании документа XML произошла ошибка. ---> System.InvalidOperationException: тип TransferObject.MusicAlbum не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически.

Странно то, что если я использую ObjectCarrier и помещаю что-то вроде строки или объекта datetime в полезную нагрузку, это работает на мобильном телефоне.

Что я делаю не так с моим классом MusicAlbum?

--- | MusicListing.cs | -------------

using System;
using System.Collections.Generic;
using System.Text;

namespace TransferObject
{
    public class MusicAlbum
    {
        public string AlbumName { get; set; }
        public string ArtistName { get; set; }
    }

}

--- | TransferObject.cs | -----------

using System;
using System.Xml.Serialization;

namespace TransferObject
{
    [XmlInclude(typeof(MusicAlbum))]
    public class ObjectCarrier
    {
        public Object PayloadObject { get; set; }
    }

}

Спасибо за предложение. Это помогло мне понять, как я это делаю. При использовании абстрактного класса мне больше не нужен носитель.

Причина, по которой это не сработало, была в том, что я сам виноват, что вместо библиотеки для мобильных устройств была библиотека windows После изменения этого ваш код работал отлично. С обеих сторон, насколько я тестировал сейчас. Если что-то изменится, я обновлю это.

1 Ответ

1 голос
/ 30 августа 2009

Насколько я понимаю, XmlInclude используется для подклассов ; то есть, если MusicAlbum унаследовано от ObjectCarrier, и вы сериализовали экземпляр MusicAlbum как ObjectCarrier.

IMO, лучшим подходом здесь будет использование сообщений для каждого типа; однако, если вы хотите пойти по маршруту [XmlInclude], вы можете определить общий базовый класс для всех поддерживаемых полезных нагрузок и иметь, например:

[XmlInclude(typeof(MusicAlbum))] // etc other types...
public abstract class PayloadBase {}

public class MusicAlbum : PayloadBase
{
    public string AlbumName { get; set; }
    public string ArtistName { get; set; }
}

public class ObjectCarrier
{
    public PayloadBase PayloadObject { get; set; }
}

И, между прочим, есть некоторые API, которые поддерживают бинарный код на CF; Протобуф-сеть - это всего лишь одно (я предвзят, как автор, но эй, это бесплатно ...).

...