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使用数据合约?

BinaryFormatter在datcontract类上的问题

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]属性给你的更细粒度的控制。