Serialization BinaryFormatter对选项/None的序列化使用F引发ArgumentNullException#

Serialization BinaryFormatter对选项/None的序列化使用F引发ArgumentNullException#,serialization,f#,option,Serialization,F#,Option,如何在F#中序列化None?以下代码抛出一个System.ArgumentNullException:对象图不能为null。错误: let f = System.Runtime.Serialization.Formatters.Binary.BinaryFormatter() let m = System.IO.MemoryStream() f.Serialize (m, None) 出于某些性能原因,编译器通常会使None=null。我认为最好的解决办法是将整个事情包装在一个额外的选项层中

如何在F#中序列化None?以下代码抛出一个
System.ArgumentNullException:对象图不能为null。
错误:

let f = System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
let m = System.IO.MemoryStream()
f.Serialize (m, None)

出于某些性能原因,编译器通常会使
None=null
。我认为最好的解决办法是将整个事情包装在一个额外的选项层中

像这样

let f = System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
let m = System.IO.MemoryStream()
f.Serialize (m,Some( None))

然后,您只需删除额外的
Some
,当您出于某些性能原因进行反序列化时,编译器通常会使
None=null
。我认为最好的解决办法是将整个事情包装在一个额外的选项层中

像这样

let f = System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
let m = System.IO.MemoryStream()
f.Serialize (m,Some( None))

然后,当您反序列化时,您只需删除一些额外的
,尝试使用不同的
序列化程序,如
NetDataContractSerializer
。据我所知,
BinaryFormatter
被视为遗留问题,并且还有一些其他问题,例如。

尝试使用不同的
序列化程序
,如
NetDataContractSerializer
。据我所知,
BinaryFormatter
被认为是遗留问题,还有一些其他问题,例如。

很好!我已更改为
NetDataContractSerializer
,但没有一个能再次工作;)ThanksI已经测试了NetDataContractSerializer,我的应用程序的整体性能下降了约30%。因此,由于性能原因,我似乎不得不继续使用BinaryFormatter…从我的测试中,我发现NDC与BF的性能特征有所不同,这取决于您试图序列化的对象图的结构。NDC原则上(但并非总是!)比BF慢,并且产生更大的序列化(大约10倍大,因为它使用xml)。然而,NDC比BF更健壮,但在某些情况下可能会失败(例如,非常大的列表会产生堆栈溢出)。您可以采用混合方法,例如通过调用任务的NDC来处理BinaryFormatter异常!我已更改为
NetDataContractSerializer
,但没有一个能再次工作;)ThanksI已经测试了NetDataContractSerializer,我的应用程序的整体性能下降了约30%。因此,由于性能原因,我似乎不得不继续使用BinaryFormatter…从我的测试中,我发现NDC与BF的性能特征有所不同,这取决于您试图序列化的对象图的结构。NDC原则上(但并非总是!)比BF慢,并且产生更大的序列化(大约10倍大,因为它使用xml)。然而,NDC比BF更健壮,但在某些情况下可能会失败(例如,非常大的列表会产生堆栈溢出)。您可以采用混合方法,例如通过调用任务的NDC来处理BinaryFormatter异常。