2

Je stocke des objets "Event" GData de l'API Google dans un datable (Ok, je devais les transformer en objet ou ils ne voulaient pas entrer), et je peux accéder à toutes les propriétés des événements parfaitement, et les utiliser pour mettre à jour Google, mais je ne peux pas sérialiser la base de données (ou un jeu de données parent) dans le fichier car:Comment enregistrer une datatable si elle contient un objet qui refuse de sérialiser?

Type 'Google.GData.Calendar.EventEntry, Google.GData.Calendar, Version = 1.4.0.2, Culture = neutre, PublicKeyToken = aa6748391206b888 'n'implémente pas l'interface IXmlSerializable donc ne peut pas procéder à la sérialisation.

Cela se produit si j'essaie simplement de sérialiser en XML ou binaire, et je ne peux pas trouver un moyen de contourner le problème; une structure de données ne peut-elle pas être sauvegardée dans un fichier d'une manière ou d'une autre? Pour définir le contexte, je sauvegardais à l'origine le GData EventFeed en XML, ce qui m'a pris environ 30 secondes pour comprendre l'utilisation de myEventFeed.saveToXML de Google API, pensant que je le rechargerais plus tard ... J'ai passé deux jours à essayer pour récupérer le xml dans un objet EventFeed, et ont maintenant basculé à enregistrer EventEntry à partir du EventFeed à un datatable à la place.

J'ai donc réussi à enregistrer le flux au XML 1.0 facilement, mais le relire dans un GData EventFeed était une histoire différente - Google vous donne myFeed.saveToXML mais pas de méthode loadfromXML: -/Donc j'ai fini par essayer d'ajouter System .Runtime.Serialization à utiliser quelque chose comme:

lecteur Dim comme XmlReader = XmlReader.Create (fileName) Dim rssfeed comme SyndicationFeed = SyndicationFeed.Load (lecteur)

Ce semblait prometteur au début, mais l'ISN de données 't all in rssFeed, plus je dois encore récupérer les données dans un Google.GData.Calendar.EventFeed avant que je puisse appeler les méthodes dont j'ai besoin, et je n'arrive pas à comprendre comment faire ça. r. Je suppose que je pourrais juste copier les bits de données les plus importants du rssFeed dans de nouveaux EventEntry, ou faire la même chose avec le datatable en extrayant les données importantes ... mais cela va être si inélégant, et risqué sur toute la ligne.

Toutes les idées que je devrais tourner maintenant? Est-ce que j'aboie les mauvais arbres?

Merci, Neil

VB .NET 3.5 VS 2008

+0

Tout d'abord, je vous suggère de modifier votre question pour supprimer tout l'historique. Concentrons-nous sur le problème que vous avez maintenant. –

+0

Désolé, c'était vraiment le titre que j'aurais dû changer - "Puis-je sauvegarder/charger des flux GData en utilisant des données, ou puis-je utiliser AtomFeed?" – jazzwhistle

Répondre

1

Pour toute autre personne qui court à travers cette question, je pense que je l'ai trouvé la réponse au problème de la sérialiser/désérialiser le XML GData. J'ai essayé de faire quelque chose de similaire à l'OP mais le EventFeed ne serait pas sérialisé, donc j'ai utilisé la méthode SaveToXML, mais comme l'OP l'a dit, il n'y a pas de méthode LoadFromXML. J'ai finalement trouvé la méthode Parse(), qui fonctionne:

 //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

Si vous avez un objet qui ne veut pas sérialisation, alors il n'y a aucun moyen de le rendre sérialisation.

Cela signifie que vous devez créer un objet qui souhaite sérialiser. Créez une classe XML-Serializable qui agira comme proxy à la classe réelle. Votre procuration aura une propriété sérialisable correspondant à chaque propriété de la classe d'origine que vous voulez voir sérialisé:

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

Cela est bon à savoir, et répond au titre de ma question :-) Il s'avère que j'étais sur la mauvaise voie cependant - J'ai finalement résolu le problème en sauvegardant/chargeant le flux comme AtomFeed, qui semble seulement être documenté ici: http://code.google.com/p/google-gdata/source/browse/trunk/clients/cs/src/unittests/coretest.cs – jazzwhistle

Questions connexes