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

Serialization 如果数据表包含拒绝序列化的对象,如何保存该数据表?,serialization,datatable,google-api,google-calendar-api,ixmlserializable,Serialization,Datatable,Google Api,Google Calendar Api,Ixmlserializable,我将Google API中的GData“Event”对象存储在一个数据表中(好吧,我必须将它们转换为对象,否则它们不会进入),我可以完美地访问事件的所有属性,并使用它们更新Google,但我无法将datatable(或父数据集)序列化到文件中,因为: 类型“Google.GData.Calendar.EventEntry,Google.GData.Calendar,Version=1.4.0.2,Culture=neutral,PublicKeyToken=aa6748391206b888”未实

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

类型“Google.GData.Calendar.EventEntry,Google.GData.Calendar,Version=1.4.0.2,Culture=neutral,PublicKeyToken=aa6748391206b888”未实现IXmlSerializable接口,因此无法继续序列化

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

为了设置上下文,我最初将gdataeventfeed保存为XML,使用googleapi的myEventFeed.saveToXML花了大约30秒来计算,我想稍后再重新加载它。。。我花了两天时间试图将xml返回到EventFeed对象中,现在转而将EventEntry从EventFeed保存到datatable中

因此,我设法轻松地将提要保存到XML 1.0,但将其读回GData EventFeed则是另一回事-Google为您提供myFeed.saveToXML,但没有loadfromXML方法:-/因此,我最终尝试添加System.Runtime.Serialization以使用以下内容:

将读卡器设置为XmlReader=XmlReader.Create(文件名) Dim rssFeed As SyndicationFeed=SyndicationFeed.Load(读卡器)

一开始这看起来很有希望,但数据并不都在rssFeed中,而且在调用所需的方法之前,我还必须将数据返回到Google.GData.Calendar.EventFeed中,我也不知道如何做到这一点。我想我们可以将最重要的数据位从rssFeed复制到新的EventEntry中,或者通过提取重要数据对datatable执行相同的操作。。。但这将是非常不雅观的,而且风险很大

你知道我现在该往哪个方向走吗?我找错树了吗

谢谢, 尼尔

VB.NET3.5
VS 2008

如果您有一个不想序列化的对象,则无法使其序列化

这意味着您需要创建一个要序列化的对象。创建一个XML可序列化类,该类将充当实际类的代理。您的代理将具有一个可序列化属性,该属性对应于您希望序列化的原始类的每个属性:

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 { }
    }
}

对于遇到这个问题的其他人,我想我已经找到了序列化/反序列化gdataxml问题的答案。我试图做一些类似于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();
//首先将字符串写入文件
List eventList=新列表();
EventQuery=新的EventQuery(提要);
AtomFeed eventFeed=_service.Query(查询)作为AtomFeed;
XmlWriter=newxmltextwriter(“test.xml”,newutf8encoding());
eventFeed.SaveToXml(编写器);
writer.Close();
//接下来,解析文件中的字符串
Stream newFs=newfilestream(“test.xml”,FileMode.Open);
AtomFeed newFeed=新的AtomFeed(新Uri(“http://someURI(“”,空);
Parse(newFs,AlternativeFormat.Atom);
newFs.Close();

首先,我建议您编辑问题以删除所有历史记录。让我们关注一下您现在遇到的问题。对不起,这确实是我应该更改的标题——“我可以使用datatables保存/加载GData提要,还是可以使用AtomFeed?”会更准确。很高兴知道,并回答了我问题的标题:-)但事实证明我走错了方向-我最终通过将提要保存/加载为AtomFeed解决了问题,这里似乎只记录了这一点: