您好,登錄后才能下訂單哦!
本篇內容主要講解“WCF的序列化問題怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“WCF的序列化問題怎么解決”吧!
WCF 基礎連接已經關閉: 連接被意外關閉。
這個錯誤可能一不小心就會碰到。總結起來應該有兩種情況導致:
1、傳輸數據過大。
第一種情況,可以采取修改本地引用服務生成的節點內的屬性解決。
binding節點中maxReceivedMessageSize的值增大即可。不過一般不建議這樣使用,對于大批量數據可采取分頁讀取方式解決。因為大批量數據傳輸,影響傳輸速度并且容易出錯。
2、傳輸類中的屬性序列化問題
這種情況我正好碰到過。如下,
服務端類的是這樣的,其它屬性省略。
[DataContract] public class SDataModel { private string id; private DataTypeEnum type; [DataMember] public string ID { get { return id; } set { id = value; } } [DataMember] public DataTypeEnum Type { get { return type; } set { type = value; } } } [DataContract] public enum DataTypeEnum { [EnumMember] 類型1 = 1, [EnumMember] 類型2 = 2, [EnumMember] 類型3 = 3, [EnumMember] 類型4 = 4 }
當時有一個方法只需要少量的屬性值就可以了,正好Type這個屬性時不需要的。所以
SDataModel model = new SDataModel();
model.ID = item.TBP_ID;
向客戶端傳輸model對象時,沒有包含Type。于是就報錯了,而且怎么也檢查不到,因為服務端執行也正常,但是客戶端卻異常了。
修改就是,在定義該字段時賦初值,改為
[DataContract] public class SDataModel { private string id; private DataTypeEnum type=DataTypeEnum.類型1; [DataMember] public string ID { get { return id; } set { id = value; } } [DataMember] public DataTypeEnum Type { get { return type; } set { type = value; } } } [DataContract] public enum DataTypeEnum { [EnumMember] 類型1 = 1, [EnumMember] 類型2 = 2, [EnumMember] 類型3 = 3, [EnumMember] 類型4 = 4 }
另一種如果使用ADO.NET Entity連接數據庫生成數據模型時,要取消延遲加載。其實在我碰到的問題中,主要是枚舉類型傳輸問題。這里據我的理解就是。
序列化的過程是,序列化生成器將對象的基本類型 按照對象的結構 解析成流,然后傳輸。接收到以后,解析流中的內容,應該是將類型都變為字符串,通過字符串匹配的方式 和本地的基本類型的類型名匹配,然后恢復對象的類型,從而還原出原對象的結構和值。
但是對也這種自定義的枚舉,如果沒有賦值,是沒有基本類型的,因此序列化就報錯了。導致本地連接被關閉。而作為基本類型Int,String等因為是基類型,序列化中可以找到與之對應的類型,因此不會報錯。
到此,相信大家對“WCF的序列化問題怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。