BinaryFormatter在datcontract类上的问题
本文关键字:问题 datcontract BinaryFormatter | 更新日期: 2023-09-27 18:09:35
我有一个class
[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();
但是你得到这个错误
类型'SerializationTypes+Car' in Assembly 'ConsoleApplication2,版本=1.0.0.0,文化=中性,PublicKeyToken=null'未被标记是可序列化的。
如果我删除[DataContract]并将其替换为[Serializable],其ok。但是为什么呢?
WCF是如何在后台(当tcpBinding ?)?
为什么不能 i使用数据合约?
WCF不使用BinaryFormatter
来序列化它的对象,它使用DataContractSerializer
(默认情况下)或其他一些序列化器(XmlSerializer
, DataContractJsonSerializer
等)。BinaryFormatter
是在WCF之前发布的(在。net Framework 1.0, IIRC中),所以不知道[DataContract]
/[DataMember]
属性(在。net Framework 3.0中与WCF一起发布)。
在netTcpBinding
上WCF仍然使用DataContractSerializer
,但不是使用"普通"XML阅读器/写入器,而是使用二进制感知的XML阅读器/写入器,这就是我们在WCF中使用二进制编码的方式。
WCF序列化器理解[Serializable]
属性,因此您也可以在WCF中使用它。或者你也可以同时使用这两个属性,如果你想让你的类型被BinaryFormatter
序列化,但使用[DC]/[DM]属性给你的更细粒度的控制。