2

我将来自 Google API 的 GData“事件”对象存储在数据表中(好吧,我必须将它们转换为对象,否则它们不会进入),我可以完美地访问事件的所有属性,并使用他们更新谷歌,但我无法将数据表(或父数据集)序列化为文件,因为:

类型 'Google.GData.Calendar.EventEntry, Google.GData.Calendar, Version=1.4.0.2, Culture=neutral, PublicKeyToken=aa6748391206b888' 没有实现 IXmlSerializable 接口,因此无法进行序列化。

无论我尝试简单地序列化为 XML 还是二进制,都会发生这种情况,而且我找不到解决问题的方法;不能以一种或另一种方式将任何数据结构保存到文件中吗?

为了设置上下文,我最初将 GData EventFeed 保存为 XML,这需要大约 30 秒才能使用 Google API 的 myEventFeed.saveToXML 弄清楚,我想我稍后再重新加载它......我花了两天时间试图获取 xml回到 EventFeed 对象,现在已切换到将 EventEntry 从 EventFeed 保存到数据表。

所以我设法轻松地将 Feed 保存到 XML 1.0,但是将它读回 GData EventFeed 是另一回事 - 谷歌给你 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 中,或者通过提取重要数据来对数据表做同样的事情……但这会很不雅,而且很冒险。

有什么想法我现在应该转向吗?我在吠叫错误的树吗?

谢谢,尼尔

VB .NET 3.5 VS 2008

4

2 回答 2

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 { }
    }
}
于 2010-02-28T18:52:00.717 回答
1

对于遇到此问题的其他任何人,我想我已经找到了序列化/反序列化 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();
于 2010-10-28T23:34:35.677 回答