2

Я храню объекты GData «Событие» из API Google в виде datable (ну, я должен был отбросить их как объект или они не вошли), и я могу полностью получить доступ ко всем свойствам событий, и использовать их для обновления Google, но я не могу сериализировать datatable (или родительский набор данных) в файл, потому что:Как сохранить datatable, если он содержит объект, который отказывается сериализовать?

Тип 'Google.GData.Calendar.EventEntry, Google.GData.Calendar, Version = 1.4.0.2, Culture = нейтральный, PublicKeyToken = aa6748391206b888 'не реализует интерфейс IXmlSerializable, поэтому не может продолжить сериализацию.

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

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

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

читателя Dim Как XmlReader = XmlReader.Create (Filename) Dim RssFeed Как SyndicationFeed = SyndicationFeed.Load (читатель)

Это выглядело перспективным на первый, но ISN данные 't all in rssFeed, плюс мне еще нужно вернуть данные в файл Google.GData.Calendar.EventFeed, прежде чем я могу вызвать методы, которые мне нужны, и я не могу понять, как это сделать eithe р. Я предполагаю, что вы можете просто скопировать самые важные бит данных из rssFeed в новую EventEntry или сделать то же самое с datatable, извлекая важные данные ... но это будет настолько неэлегантно и рискованно вниз по линии.

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

Спасибо, Нил

VB .NET 3.5 VS 2008

+0

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

+0

Извините, это было действительно название, которое я должен был изменить - «Могу ли я сохранять/загружать GData-каналы с использованием данных, или я могу использовать AtomFeed?«Было бы более точным. – jazzwhistle

ответ

1

Для всех, кто работает по этому вопросу, я думаю, я нашел ответ на проблему сериализация/десериализация XML-данных GData. Я попытался сделать что-то похожее на 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(); 
2

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

Это означает, что вам нужно создать объект, который хочет сериализовать. Создайте класс 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 { } 
    } 
} 
+0

Это полезно знать, и отвечает на заголовок моего вопроса :-) Оказывается, я был на неправильном треке - я, наконец, решил проблему, сохраняя/загружая Feed как AtomFeed, что представляется только для документирования: http://code.google.com/p/google-gdata/source/browse/trunk/clients/cs/src/unittests/coretest.cs – jazzwhistle

 Смежные вопросы

  • Нет связанных вопросов^_^