c# - 序列化时我犯了什么错误?

标签 c# serialization

这会导致运行时出现序列化异常。这只是一个演示项目,用于测试执行此操作的最佳方法。我包括了主要方法和我试图序列化的类。

忽略:我真的不能添加更多细节,我已经描述了问题,附上了代码,这个“请添加更多细节”的事情是有史以来最愚蠢的事情。我已经发布了。

Data toSend = new Data();
toSend.Output();

///SERIALIZE

BinaryFormatter formatter = new BinaryFormatter();
Stream streamOut = File.OpenWrite("file");
formatter.Serialize(streamOut, toSend);
streamOut.Close();


Console.WriteLine("----------------------------");
///DESERIALIZE

Stream streamIn = File.OpenRead("file");
Object received = formatter.Deserialize(streamIn);
Data toReceive = (Data)received;
toReceive.Output();

class Data : ISerializable
{
    int integerData;
    string stringData;
    bool booleanData;
    int shouldnotbeserialized;

    public Data()
    {
        integerData = 1;
        stringData = "Hello";
        booleanData = true;
        shouldnotbeserialized = 55;
    }

    //To deserialize
    public Data(SerializationInfo info, StreamingContext context)
    {
        integerData = info.GetInt32("theint");
        stringData = info.GetString("thestring");
        booleanData = info.GetBoolean("thebool");
    }

    public void Output()
    {
        Console.WriteLine(integerData);
        Console.WriteLine(stringData);
        Console.WriteLine(booleanData);
        Console.WriteLine(shouldnotbeserialized);
    }

    //Implemented method to serialize
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("thestring", stringData);
        info.AddValue("theint", integerData);
        info.AddValue("thebool", booleanData);
    }
}

异常信息:

Type 'SerializationDemo.Data' in Assembly 'SerializationDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

最佳答案

在异常信息中给你答案:

Type 'SerializationDemo.Data' in Assembly 'SerializationDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

您需要使用 Serializable 标记您的类(class)属性。

[Serializable()]
class Data : ISerializable

从上下文看来,您似乎要通过网络传输对象(根据局部变量名称​​toSendtoReceive 推断)。您需要注意,例如,如果您使用客户端-服务器模型,则默认情况下,从服务器软件序列化和发送的对象将无法从客户端软件反序列化。

这是因为二进制序列化的基本特征是它保持了类型系统的保真度。类型系统保真度表示类型信息在序列化过程中没有丢失。这意味着当您序列化一个对象时,不仅是写入数据流的“对象的状态”,还有类的名称和包含的程序集。即使您在要反序列化数据的程序集中定义了类 Data,反序列化方法也会失败(抛出异常),因为反序列化器将寻找类型 Program1.Namespace .Data 不是 Program2.Namespace.Data。要解决这个问题,您可以在相互程序集(类库)中定义数据消息或通过定义 SerializationBinder这将使您基本上可以欺骗反序列化方法,使其认为您仍在同一个程序集中。

关于c# - 序列化时我犯了什么错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16121281/

相关文章:

jquery - $(form).serialize() 文件字段的解决方法

java - 在独立应用程序中, session 对象存储在哪里?

c++ - 使用指向对象的指针 vector 进行 boost (C++ - linux)

c# - IPv4 映射的 IPv6 地址

c# - 在另一个 IList 数据模型中存储 Array 或 IList

c# - DllImport user32 与 user32.dll

java - 我该如何反序列化?有人可以帮我做这个吗?我无法反序列化

实现 Serializable 接口(interface)的 Java 类

c# - 无法通过 JavaScript 清除 ASP.net

c# - 如何找到下一个八月? C#