.net BinaryFormatter.Serialize向字节数组长度添加28

.net BinaryFormatter.Serialize向字节数组长度添加28,.net,arrays,serialization,f#,stream,.net,Arrays,Serialization,F#,Stream,我有以下代码片段,它在TcpClient网络流上接收消息,其中可能包含obj类型的某些内容,并尝试将其序列化为字节数组: let readStreamToFile (client:TcpClient) outputPath = let formatter = new BinaryFormatter() try let message = (formatter.Deserialize (client.GetStream ())) :?> Message

我有以下代码片段,它在
TcpClient
网络流上接收消息,其中可能包含
obj
类型的某些内容,并尝试将其序列化为字节数组:

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!!!"
不幸的是,当我调试这段代码时,我可以看到收到的内容很好,长度为46,但是
formatter.Serialize(mStream,content)
之后对
mStream.ToArray()
的调用长度为74。也就是说,它在长度46的实际数组之前添加28项。这28项也不是空的,有些包含值


这正常吗?如何使
字节内容
始终与我的
obj
内容相同?

二进制格式化程序在序列化时对对象的类型信息和值进行编码。在反序列化时重建对象需要类型信息。额外的字节是类型信息。

如果只需要字节,为什么要调用
格式化程序.Serialize
,为什么不直接获取字节?二进制格式化程序在序列化时对对象的类型信息和值进行编码。反序列化时重建对象需要类型信息。@TnTinMn比我快了一分钟。额外的28个字节是类型信息,以BinaryFormatter能够理解的某种格式——这样,当它反序列化数据时,它将能够生成正确类型的对象。更大的问题是你想要什么以及为什么。如果@TnTinMn想补充这一点作为答案,我会欣然接受。我猜这是因为我没有在序列化之前调用反序列化。