实时SDK-通过内存流上传XML文件



我对Live SDK(SkyDrive SDK)的client.UploadAsync方法有点问题。由于某些原因,我的代码不起作用,或者更具体地说,它上传了一个空文件。它不会抛出任何错误,并且流的序列化是有效的(我当然知道)。

内存流似乎还可以。(由于我没有工具来真正查看其中的数据,我只是通过查看其"Length"属性来猜测它还可以)。

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

关于为什么会发生这种情况,有什么建议吗?

  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(); }
            }
        }
    }

在调用UploadAsync方法之前,必须将内存流"倒带"到开头。想象一下,内存流就像一个磁带,你可以在上面记录东西。"读/写头"总是漂浮在磁带的某个点上,这就是你的情况下的结束,因为你刚刚把所有序列化的数据都写在上面。上传方法试图通过在磁带上向前移动来读取,意识到它已经结束了。因此,您上传了一个空文件。

复卷所需的方法是:

memoryStream.Seek(0, SeekOrigin.Begin);

此外,对IDisposable对象使用using指令也是一种很好的做法,即内存流。这样就不需要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);
    }
}

相关内容

  • 没有找到相关文章

最新更新