我对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);
}
}