溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

WCF的序列化問(wèn)題怎么解決

發(fā)布時(shí)間:2021-12-15 09:32:15 來(lái)源:億速云 閱讀:130 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“WCF的序列化問(wèn)題怎么解決”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“WCF的序列化問(wèn)題怎么解決”吧!

WCF 基礎(chǔ)連接已經(jīng)關(guān)閉: 連接被意外關(guān)閉。
這個(gè)錯(cuò)誤可能一不小心就會(huì)碰到??偨Y(jié)起來(lái)應(yīng)該有兩種情況導(dǎo)致:
1、傳輸數(shù)據(jù)過(guò)大。
第一種情況,可以采取修改本地引用服務(wù)生成的節(jié)點(diǎn)內(nèi)的屬性解決。
binding節(jié)點(diǎn)中maxReceivedMessageSize的值增大即可。不過(guò)一般不建議這樣使用,對(duì)于大批量數(shù)據(jù)可采取分頁(yè)讀取方式解決。因?yàn)榇笈繑?shù)據(jù)傳輸,影響傳輸速度并且容易出錯(cuò)。
2、傳輸類(lèi)中的屬性序列化問(wèn)題
這種情況我正好碰到過(guò)。如下,
服務(wù)端類(lèi)的是這樣的,其它屬性省略。

[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]
       類(lèi)型1 = 1,
       [EnumMember]
       類(lèi)型2 = 2,
       [EnumMember]
       類(lèi)型3 = 3,
       [EnumMember]
       類(lèi)型4 = 4
   }

當(dāng)時(shí)有一個(gè)方法只需要少量的屬性值就可以了,正好Type這個(gè)屬性時(shí)不需要的。所以
             SDataModel model = new SDataModel();


             model.ID = item.TBP_ID;
向客戶(hù)端傳輸model對(duì)象時(shí),沒(méi)有包含Type。于是就報(bào)錯(cuò)了,而且怎么也檢查不到,因?yàn)榉?wù)端執(zhí)行也正常,但是客戶(hù)端卻異常了。
修改就是,在定義該字段時(shí)賦初值,改為

[DataContract]
    public class SDataModel
    {
        private string id;
        private DataTypeEnum type=DataTypeEnum.類(lèi)型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]
        類(lèi)型1 = 1,
        [EnumMember]
        類(lèi)型2 = 2,
        [EnumMember]
        類(lèi)型3 = 3,
        [EnumMember]
        類(lèi)型4 = 4
    }

另一種如果使用ADO.NET Entity連接數(shù)據(jù)庫(kù)生成數(shù)據(jù)模型時(shí),要取消延遲加載。其實(shí)在我碰到的問(wèn)題中,主要是枚舉類(lèi)型傳輸問(wèn)題。這里據(jù)我的理解就是。

序列化的過(guò)程是,序列化生成器將對(duì)象的基本類(lèi)型 按照對(duì)象的結(jié)構(gòu) 解析成流,然后傳輸。接收到以后,解析流中的內(nèi)容,應(yīng)該是將類(lèi)型都變?yōu)樽址?,通過(guò)字符串匹配的方式 和本地的基本類(lèi)型的類(lèi)型名匹配,然后恢復(fù)對(duì)象的類(lèi)型,從而還原出原對(duì)象的結(jié)構(gòu)和值。

但是對(duì)也這種自定義的枚舉,如果沒(méi)有賦值,是沒(méi)有基本類(lèi)型的,因此序列化就報(bào)錯(cuò)了。導(dǎo)致本地連接被關(guān)閉。而作為基本類(lèi)型Int,String等因?yàn)槭腔?lèi)型,序列化中可以找到與之對(duì)應(yīng)的類(lèi)型,因此不會(huì)報(bào)錯(cuò)。

到此,相信大家對(duì)“WCF的序列化問(wèn)題怎么解決”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

wcf
AI