我上课了
[DataContract]
public class Car
{
public bool pbIsHatchBack;
string prSt = "royi";
}
我想用 BinaryFormatter 序列化它:
BinaryFormatter binFormat = new BinaryFormatter();
Stream fStream = new FileStream("c:\\CarData.dat", FileMode.Create, FileAccess.Write, FileShare.None);
binFormat.Serialize(fStream, carObj);
fStream.Close();
但你得到这个错误
在程序集'ConsoleApplication2中输入'SerializationTypes Car',Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'未标记为可序列化 .
如果我删除[ DataContract ]并将其替换为[ Serializable ],则为 ok . 但 why ?
WCF如何在场景后面做(当tcpBinding?)?
为什么 can't 我使用DataContract ???
1 回答
WCF不使用
BinaryFormatter
来序列化其对象,它使用DataContractSerializer
(默认情况下)或其他一些序列化程序(XmlSerializer
,DataContractJsonSerializer
等) .BinaryFormatter
在WCF之前发布(在.NET Framework 1.0,IIRC中),所以不知道[DataContract]
/[DataMember]
属性(在.NET Framework 3.0中与WCF一起发布) .在
netTcpBinding
上,WCF仍然使用DataContractSerializer
,但它不使用"normal" XML读取器/写入器,而是使用二进制感知的XML读取器/写入器,这就是我们在WCF中使用二进制编码的方式 .WCF序列化程序了解
[Serializable]
属性,因此您也可以将其与WCF一起使用 . 或者您也可以使用这两个属性,如果您希望类型可以由BinaryFormatter
序列化,但使用[DC] / [DM]属性为您提供的更细粒度的控件 .