Live SDK - 通过Memorystream上传XML文件

时间:2012-07-16 18:42:14

标签: c# windows-phone-7 stream live onedrive

Live SDK(SkyDrive SDK)的client.UploadAsync方法存在一些问题。我的代码由于某种原因不起作用,或者更具体地说它上传了一个空文件。它没有抛出任何错误,序列化流工作(我肯定知道)。

甚至看起来Memory Memory也行。 (因为我没有工具可以真正看到其中的数据,我只是想通过查看它的'长度'属性就可以了。)

UploadAsync方法也很好,或者至少它在我第一次将数据序列化为IsolatedStorage中的.xml文件然后使用IsolatedStorageFileStream读取它然后最终发送该流时效果很好。 (然后它上传了数据)

有关为何可能发生这种情况的任何建议?

  public void UploadFile<T>(string skyDriveFolderID, T data, string fileNameInSkyDrive)
    {
        this.fileNameInSkyDrive = fileNameInSkyDrive;
        {
            try
            {
                memoryStream =  new MemoryStream();

                XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
                xmlWriterSettings.Indent = true;

                XmlSerializer serializer = new XmlSerializer(typeof(T));
                using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
                {
                    serializer.Serialize(xmlWriter, data);
                }
                client.UploadAsync(skyDriveFolderID, fileNameInSkyDrive, true, memoryStream, null);

            }

            catch (Exception ex)
            {
                if (memoryStream != null) { memoryStream.Dispose(); }
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

在调用UploadAsync方法之前,您必须将内存流“回放”到开头。想象一下,内存流就像是一个录制内容的磁带。 “读/写头”总是浮动在磁带的某个点上,这就是你的情况的结束,因为你只是将所有序列化数据写到它上面。上传方法试图通过在磁带上向前移动来读取它,意识到它已经在它的末尾。因此,您上传了一个空文件。

倒带所需的方法是:

memoryStream.Seek(0, SeekOrigin.Begin);

此外,对于内存流所用的using个对象,最好使用IDisposable指令。这样您就不需要try {...} finally { ...Dispose(); }(这由using完成。)

您的方法可能如下所示:

public void UploadFile<T>(string skyDriveFolderID, T data, string fileNameInSkyDrive)
{
    this.fileNameInSkyDrive = fileNameInSkyDrive;

    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
    xmlWriterSettings.Indent = true;

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    using (var memoryStream = new MemoryStream())
    {
        using (var xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
        {
            serializer.Serialize(xmlWriter, data);
        }

        memoryStream.Seek(0, SeekOrigin.Begin);

        client.UploadAsync(skyDriveFolderID, fileNameInSkyDrive, true, memoryStream, null);
    }
}