gpt4 book ai didi

C# 序列化失败 - 解决方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:41 24 4
gpt4 key购买 nike

下面的程序会导致以下失败:

Field in TypedReferences cannot be static or init only

基于此,显而易见的解决方法是:

  1. 移除 private readonly T _value 上的 readonly 修饰符

但是,以下两个更改也消除了故障:

  1. struct Data 更改为 class Data
  2. public int[] Content 更改为 public int Content

有谁知道 BinaryFormatter 内部发生了什么,允许序列化在案例 #2 和 #3 中继续进行?


using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace SerializationStumper {

// *** helper

public static class Serializer {
public static MemoryStream SerializeToStream<T>(T o)
{
var stream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, o);
return stream;
}

public static T DeserializeFromStream<T>(MemoryStream stream)
{
IFormatter formatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}

public static T RoundTrip<T>(T v) {
return DeserializeFromStream<T>(SerializeToStream<T>(v));
}
}

// *** set up data structures

[Serializable]
public struct Wrapped<T> {
private readonly T _value;

public Wrapped(T value) {
_value = value;
}
}

[Serializable]
public struct Data {
public int[] Content;
}

// *** Perform test

public class Program {
private static void Main(string[] args)
{
var wrapped = new Wrapped<Data>(new Data { Content = new int[] { 1, 2, 3 } } );
var roundtrip = Serializer.RoundTrip(wrapped);
Console.WriteLine(roundtrip);
}
}
}

最佳答案

既然还没有人回答,那我就试试吧……

它序列化很好,但反序列化失败。

我不确定,但我怀疑这是因为作为一个结构,反序列化器不知道这个数组有多大:

    public int[] Content;

所以它不知道要读取多少字节来填充数组。作为一个类,它可能会将长度序列化为数据。

如果您同时将结构和类序列化为不同的文件,它们的内容确实会略有不同,并且序列化类中的一个附加字节是数字 3,我猜这是数组长度。虽然我还没有研究过二进制输出格式来确定。

“修复”可能与 fixed size buffers 有关这样反序列化器就会知道数据流中有多少字节组成了数组。不过,我还没有制定使用它们的可行解决方案。

编辑:您似乎无法序列化固定大小的缓冲区,因此请忽略上述内容。

所以 #2 可以工作,因为它将数组长度序列化到数据流中,而 #3 可以工作,因为在 int 中是固定字节大小。

关于C# 序列化失败 - 解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28639682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com