2

BinaryFormatter私のコードで奇妙な振る舞いをしています。次のようなコードがあります

[Serializable]
public class LogEntry
{        
    private int id;

    private List<object> data = new List<object>();

    public int Id
    {
        get { return id; }
    }

    public IList<object> Data
    {
        get { return data.AsReadOnly(); }
    }
    ...
}
....
....
private static readonly BinaryFormatter logSerializer = new BinaryFormatter();
....
....
public void SerializeLog(IList<LogEntry> logEntries)
{
        using (MemoryStream serializationStream = new MemoryStream())
        {
            logSerializer.Serialize(serializationStream, logEntries);
            this.binarySerializedLog = serializationStream.GetBuffer();
        }
}

一部のマシン (32 ビットまたは 64 ビットのマシン) では、バイナリ形式でシリアル化されますが、これは想定どおりです。しかし、一部のマシン (すべて 64 ビット マシンであり、デバッグ ビルド用ではありません) では、シリアル化されておらず、すべての個々のクラス名 ( ) および値の値binarySerializedLogが表示されています。私の質問は、この種の行動には特定の理由があるのでしょうか、それとも何か間違いを犯しているのでしょうか? 前もって感謝します。ToString()Data...LogEntryid

4

1 に答える 1

0

あなたの質問はあまり明確ではありません(「シリアル化しない」と定義できますか?)が、いくつかの考えがあります:

実際ToArray()には、バッファをキャプチャするために使用する必要がありますGetBuffer()(これ安価ですが、特大の配列を返すため、 と組み合わせてのみ使用する必要がありますLength)。

これはどこで見てい.ToString()ますか?BinaryFormatterオブジェクト タイプを書き込み、リフレクションを使用してフィールドを書き込む ( の場合[Serializable]) か、顧客のシリアル化を使用する ( の場合ISerializable)。それは決して呼び出しません.ToString()(それがあなたのすることでない限りISerializable)。ただし、文字列など「そのまま」出力されます。

はバージョン間で脆弱になる可能性があるため、このデータを長期間保持する場合は注意BinaryFormatterしてください (ただし、両方の端を同時に更新すると仮定すると、通常、転送には問題ありません)。オブジェクトが何であるかを事前に知っている場合.Dataは、より安定性を提供できるさまざまなコントラクトベースのシリアライザーがあります。調査する価値があると思われる場合は、より具体的なサポートを提供できます。

于 2009-12-08T06:23:34.007 に答える