Как сохранить таблицу данных, если она содержит объект, который отказывается сериализоваться?

Я храню объекты GData "Event" из Google API в базе данных (хорошо, мне пришлось преобразовать их в объект, иначе они не войдут), и я могу отлично получить доступ ко всем свойствам событий и использовать их для обновления Google, но я не могу сериализовать таблицу данных (или родительский набор данных) в файл, потому что:

Тип «Google.GData.Calendar.EventEntry, Google.GData.Calendar, версия = 1.4.0.2, культура = нейтральная, PublicKeyToken = aa6748391206b888» не реализует интерфейс IXmlSerializable, поэтому не может продолжить сериализацию.

Это происходит независимо от того, пытаюсь ли я просто сериализоваться как XML или двоичный файл, и я не могу найти способ обойти проблему; нельзя ли так или иначе сохранить любую структуру данных в файл?

Чтобы установить контекст, я изначально сохранял GData EventFeed как XML, что заняло около 30 секунд, чтобы выяснить, используя myEventFeed.saveToXML API Google, думая, что я просто перезагружу его позже... Я потратил два дня, пытаясь получить xml обратно в объект EventFeed и теперь вместо этого переключились на сохранение EventEntry из EventFeed в таблицу данных.

Таким образом, мне удалось легко сохранить Feed в XML 1.0, но чтение его обратно в GData EventFeed было другой историей - Google предоставил вам myFeed.saveToXML, но не метод loadfromXML :-/ В итоге я попытался добавить System.Runtime.Serialization использовать что-то вроде:

Dim reader As XmlReader = XmlReader.Create(fileName) Dim rssFeed As SyndicationFeed = SyndicationFeed.Load(reader)

Сначала это выглядело многообещающе, но не все данные находятся в rssFeed, к тому же мне еще нужно вернуть данные в Google.GData.Calendar.EventFeed, прежде чем я смогу вызвать нужные мне методы, а я не могу придумай как это сделать. Я полагаю, можно было бы просто скопировать самые важные биты данных из rssFeed в новые EventEntry или сделать то же самое с таблицей данных, извлекая важные данные... но это будет так неэлегантно и рискованно в будущем.

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

Спасибо, Нил

ВБ .NET 3.5 VS 2008


person jazzwhistle    schedule 28.02.2010    source источник
comment
Прежде всего, я предлагаю вам отредактировать свой вопрос, чтобы удалить всю историю. Давайте сосредоточимся на проблеме, которая у вас есть сейчас.   -  person John Saunders    schedule 28.02.2010
comment
Извините, это действительно заголовок, который я должен был изменить - Могу ли я сохранять / загружать фиды GData, используя таблицы данных, или я могу использовать AtomFeed? Было бы точнее.   -  person jazzwhistle    schedule 01.03.2010


Ответы (2)


Для всех, кто сталкивается с этим вопросом, я думаю, что нашел ответ на проблему сериализации/десериализации GData XML. Я пытался сделать что-то похожее на OP, но EventFeed не сериализуется, поэтому я использовал метод SaveToXML, но, как указано в OP, метода LoadFromXML не существует. Наконец-то я нашел метод Parse(), который работает:

        //first write the string to a file
        List<EventEntry> eventList = new List<EventEntry>();

        EventQuery query = new EventQuery(feed);
        AtomFeed eventFeed = _service.Query(query) as AtomFeed;
        XmlWriter writer = new XmlTextWriter("test.xml", new UTF8Encoding());

        eventFeed.SaveToXml(writer);
        writer.Close();

        //next, parse the string from the file
        Stream newFs = new FileStream("test.xml", FileMode.Open);

        AtomFeed newFeed = new AtomFeed(new Uri("http://someURI"), null);
        newFeed.Parse(newFs, AlternativeFormat.Atom);
        newFs.Close();
person porq    schedule 28.10.2010

Если у вас есть объект, который не хочет сериализоваться, то нет никакого способа заставить его сериализоваться.

Это означает, что вам нужно создать объект, который нужно сериализовать. Создайте класс XML-Serializable, который будет действовать как прокси для фактического класса. Ваш прокси будет иметь сериализуемое свойство, соответствующее каждому свойству исходного класса, которое вы хотите видеть сериализованным:

public class Original
{
    private string _property1;
    private int _property2;

    public string Property1
    {
        get { return _property1; }
    }

    public int Property2
    {
        get { return _property2; }
    }
}

public class ProxyToOriginal
{
    private readonly Original _original;

    public ProxyToOriginal(Original original)
    {
        _original = original;
    }

    public string Property1
    {
        get { return _original.Property1; }
        set {  }
    }

    public int Property2
    {
        get { return _original.Property2; }
        set { }
    }
}
person John Saunders    schedule 28.02.2010
comment
Это полезно знать, и это отвечает на заголовок моего вопроса :-) Оказывается, я был на неправильном пути - я наконец решил проблему, сохранив/загрузив канал как AtomFeed, который, кажется, задокументирован только здесь: code.google.com/p /google-gdata/source/browse/trunk/clients/cs/ - person jazzwhistle; 01.03.2010