如果数据表包含拒绝序列化的对象,如何保存?

时间:2010-02-28 18:38:47

标签: serialization datatable google-api google-calendar-api ixmlserializable

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

输入'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对象中,现在已切换到将EventEed从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(读者)

这一开始看起来很有希望,但数据并非全部都在rssFeed中,而且在我可以调用我需要的方法之前,我仍然需要将数据恢复到Google.GData.Calendar.EventFeed中,而且我无法弄清楚如何做到这一点。我想可以将最重要的数据位从rssFeed复制到新的EventEntry中,或者通过提取重要数据对数据表执行相同的操作......但这样做会非常优雅,而且风险很大。 / p>

我现在应该转向哪种想法?我在吠叫错误的树木吗?

谢谢, 尼尔

VB .NET 3.5 VS 2008

2 个答案:

答案 0 :(得分: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 { }
    }
}

答案 1 :(得分: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();