.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想补充这一点作为答案,我会欣然接受。我猜这是因为我没有在序列化之前调用反序列化。