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
はいつも私のobj
content
と同じですか?
バイトだけが必要な場合は、なぜ 'formatter.Serialize'を呼び出すのですか?なぜバイトを取得しないのですか? –
BinaryFormatterは、シリアル化でオブジェクトの型情報と値の両方をエンコードします。デシリアライズ時にオブジェクトを再構築するには型情報が必要です。 – TnTinMn
@TnTinMnは分でそれに私を打つ。追加の28バイトは、BinaryFormatterが理解できる形式の型情報です。データを逆シリアル化するときに、正しい型のオブジェクトを生成できるようになります。 – rmunn