这会在运行时导致序列化异常。这只是一个测试最佳方法的演示项目。我包括主要方法和我试图序列化的类。
忽略:我真的无法添加更多细节,我已经描述了问题,附上了代码,这个“请添加更多细节”这件事是有史以来最愚蠢的事情。我已经发布了。
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);
}
}
异常消息:
在程序集'SerializationDemo中输入'SerializationDemo.Data', Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'未标记 可序列化。
答案 0 :(得分:4)
答案是在异常消息中给出的:
在程序集'SerializationDemo中输入'SerializationDemo.Data', Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'未标记 可序列化。
您需要使用Serializable
属性标记您的课程。
[Serializable()]
class Data : ISerializable
从上下文看,您似乎要将对象传输到网络中(由于本地变量名 toSend , toReceive 而推断)。您需要注意,如果您使用客户端 - 服务器模型,那么从服务器软件序列化并发送的对象将无法从客户端软件中反序列化。
这是因为二进制序列化的基本特征是它保留了类型系统的保真度。类型系统保真度表示类型信息在序列化过程中不会丢失。这意味着当您序列化一个对象时,不仅是“对象的状态”写入数据流,而且还有类的名称和包含的程序集。即使您在要对数据进行反序列化的程序集中定义了类Data
,deserialize方法也会失败(抛出异常),因为反序列化器将查找类型Program1.Namespace.Data
而不是{{1 }}。要解决这个问题,您可以在相互汇编(类库)中定义数据消息,或者通过定义SerializationBinder
来允许您基本上欺骗反序列化方法,使您认为您仍然在同一个程序集中。