1

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

甚至似乎内存流还可以。(因为我没有工具可以真正查看其中的数据,我只是通过查看它的“长度”属性来猜测它是可以的)。

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

1 回答 1

2

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

您需要的倒带方法是:

memoryStream.Seek(0, SeekOrigin.Begin);

此外,最好将using指令用于IDisposable对象,即内存流。这样你就不需要 a 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);
    }
}
于 2012-07-16T23:31:15.533 回答