我有一个使用System.Memory<double>
属性的类,我们称之为PROP 1和CLASS 1
当这个类被序列化为JSON文件时,它以一种非常常见的方式保存:
(...)“PROP1”:[7200.0,7200.0,7200.0](...)
尝试通过JsonConvert.DeserializeObject<CLASS1>File.ReadAllText(fileName));
进行反序列化时
我得到以下异常:
无法反序列化当前JSON数组(例如[1,2,3])转换为类型'System.Memory' 1[System.Double]',因为该类型需要JSON对象(例如,{“name”:“value”})来正确反序列化。要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化的类型更改为数组或实现集合接口的类型(例如ICollection,IList),比如可以从JSON数组反序列化的List。也可以将JsonArrayAttribute添加到类型中,以强制它从JSON数组反序列化。
我猜它不能序列化它,因为内存的工作方式更像一个指针,所以你应该先创建一个内存引用的对象。但是我找不到解决这个问题的方法(除了将类重写为另一种类型)……我也找不到任何有类似问题的线程。有什么想法如何反序列化它??
2条答案
按热度按时间bvuwiixz1#
由于Json.NET似乎没有内置的序列化和反序列化
Memory<T>
和ReadOnlyMemory<T>
的支持,您可以为它们创建generic converters,将序列化和反序列化Memory<T>
和ReadOnlyMemory<T>
切片内容的“快照”,如下所示:然后使用以下设置序列化和反序列化模型:
和/或应用于您的模型,如下所示:
警告和注意事项:
***警告:数组切片的引用不会被保留。**如果您的
Memory<double>
是某个数组的切片,并且该数组也在模型中的其他地方被序列化,那么当反序列化Memory<double>
时,它将不会通过引用引用反序列化的数组,而是引用它自己的数组副本。如果需要保留数组切片的引用,则需要一个不同的(并且复杂得多的)转换器。
Memory<byte>
和ReadOnlyMemory<byte>
也做了同样的操作。但是如果Memory<byte>
之前已经被序列化为JSON数组,它将被正确读取。ReadOnlyMemory<char>
有时可以 Package 一个字符串,所以我将其序列化,但没有对只能 Package 一个char数组的Memory<char>
进行相同的操作。如果你不想这样,可以在
ReadOnlyMemoryConverter<T>.Read()
内部传递serializeAsString : false
。Memory<T>
生成合理的序列化。我得到的不是JSON数组,而是也许你已经安装了一些转换器来处理序列化而不是反序列化?
演示小提琴here。
s1ag04yj2#
以下答案适用于JSON.Net。
您可以使用自定义
JsonConverter
。然后你就可以应用它了
dotnetfiddle