1

私は C# .net 4.0 を使用していますが、それを行う方法がわかりませんが、ご存知でしょうか? :)
私はその方法でシリアライゼーションを行います:

public static void SaveCollection<T>(string file_name, T list)
{
    BinaryFormatter bf = new BinaryFormatter();
    FileStream fs = null;

    try
    {
        fs = new FileStream(Application.StartupPath + "/" + file_name, FileMode.Create);
        bf.Serialize(fs, list);
        fs.Flush();
        fs.Close();
    }
    catch (Exception exc)
    {
        if (fs != null)
            fs.Close();

        string msg = "Unable to save collection {0}\nThe error is {1}";
        MessageBox.Show(Form1.ActiveForm, string.Format(msg, file_name, exc.Message));
    }
}
4

3 に答える 3

2

したがって、オブジェクトグラフのサイズを実際に事前に知っていることを使用するとします。これ自体は難しいかもしれませんが、実際にそうしていると仮定しましょう:)。あなたはこれを行うことができます:

public class MyStream : MemoryStream {
    public long bytesWritten = 0;
    public override void Write(byte[] buffer, int offset, int count) {                
        base.Write(buffer, offset, count);
        bytesWritten += count;
    }

    public override void WriteByte(byte value) {
        bytesWritten += 1;
        base.WriteByte(value);
    }
}

次に、次のように使用できます。

BinaryFormatter bf = new BinaryFormatter();
var s = new MyStream();
bf.Serialize(s, new DateTime[200]);

これにより、書き込まれたバイトが得られるため、それを使用して時間を計算できます。注:ストリームクラスのさらにいくつかのメソッドをオーバーライドする必要がある場合があります。

于 2012-08-24T17:11:41.533 に答える
1

特定の頻度で実行されるタイマーを開始できます (たとえば、1 秒間に 4 回ですが、実際には進行状況を更新する頻度以外には何の影響もありません)。これは、現在データの転送にかかった時間を計算し、残りを推定します。時間。例えば:

private void timer1_Tick(object sender, EventArgs e)
{
    int currentBytesTransferred = Thread.VolatileRead(ref this.bytesTransferred);
    TimeSpan timeTaken = DateTime.Now - this.startDateTime;

    var bps = timeTaken.TotalSeconds / currentBytesTransferred;
    TimeSpan remaining = new TimeSpan(0, 0, 0, (int)((this.totalBytesToTransfer - currentBytesTransferred) / bps));
    // TODO: update UI with remaining
}

これはthis.bytesTransferred、別のスレッドで更新していて、AnyCPU をターゲットにしていることを前提としています。

于 2012-08-24T16:47:14.980 に答える
1

あるとは思いません。私のアドバイスは、シリアル化にかかる時間を測定し (測定を数百回または数千回繰り返す)、それらを平均化し、それをシリアル化の進行状況を計算するための定数として使用することです。

于 2012-08-24T16:29:01.817 に答える