1

client.UploadAsyncLive SDK(SkyDrive SDK)の方法に少し問題があります。何らかの理由で私のコードが機能しないか、より具体的には空のファイルをアップロードします。エラーは発生せず、ストリームへのシリアル化は機能します(確かにそれはわかっています)。

メモリストリームはOKのようです。(実際にデータを表示するツールがないため、'Length'プロパティを確認することで問題ないと思います)。

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このようにあなたは必要ありません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 に答える