【问题标题】:Live SDK - Uploading XML file trough Memory StreamLive SDK - 通过 Memory Stream 上传 XML 文件
【发布时间】:2012-07-16 18:42:14
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    在调用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);
        }
    }
    

    【讨论】:

    • 我知道“使用”,但我对它和异步上传几乎没有问题(它只是无法正常工作(我猜它试图尽快处理流))。无论如何感谢您的回答和简单的解释。
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多