2016-08-25 15 views
1

objの形式でコンテンツを含む可能性のあるTcpClientネットワークストリームでメッセージを受け取る次のコードスニペットがあり、それをバイト配列にシリアル化しようとします:私はこのコードをデバッグするときに受信したコンテンツが良好で、46の長さを持っていますが、formatter.Serialize (mStream, content)mStream.ToArray()への呼び出しがある74の長さを持っていることをバイト配列の長さに28を追加するBinaryFormatter.Serialize

let readStreamToFile (client:TcpClient) outputPath = 
    let formatter = new BinaryFormatter() 

    try 
     let message = (formatter.Deserialize (client.GetStream())) :?> Message 
     match message.Type with 
     | FileTransfer -> 
      match message.Content with 
      | Some content -> 
       let bytesContent = 
        use mStream = new MemoryStream() 
        formatter.Serialize (mStream, content) 
        mStream.ToArray() 

       File.WriteAllBytes (outputPath, bytesContent) 
      | None -> 
       failwith "There was no content in the FileSync message!!!" 
     | _ -> 
      () 
    with 
    | :? InvalidCastException as ex -> 
     failwith "Message format unknown!!!" 

残念ながら、私は、それを見ることができますの前に28アイテムを追加します。これらの28個のアイテムは空でもなく、値を含むものもあります。

これは正常ですか? bytesContentはいつも私のobjcontentと同じですか?

+3

バイトだけが必要な場合は、なぜ 'formatter.Serialize'を呼び出すのですか?なぜバイトを取得しないのですか? –

+7

BinaryFormatterは、シリアル化でオブジェクトの型情報と値の両方をエンコードします。デシリアライズ時にオブジェクトを再構築するには型情報が必要です。 – TnTinMn

+1

@TnTinMnは分でそれに私を打つ。追加の28バイトは、BinaryFormatterが理解できる形式の型情報です。データを逆シリアル化するときに、正しい型のオブジェクトを生成できるようになります。 – rmunn

答えて

3

BinaryFormatterは、シリアル化でオブジェクトの型情報と値の両方をエンコードします。デシリアライズ時にオブジェクトを再構築するには型情報が必要です。余分なバイトはタイプ情報です。

関連する問題