Wcf序列化的迴圈引用問題1

2022-02-26 16:16:09 字數 3961 閱讀 5615

1.wcf資料契約序列化,使用的類datacontractserializer

預設如果類不指定[datacontract],則序列化類的所有字段,並且在出現迴圈引用的時候回丟擲異常,服務終止

msdn文件說明:

/*

* wcf 資料契約序列化使用「datacontractserializer」,底層是xml序列化

* 1.如果類上不指定 [datacontract],預設序列化,物件的所有屬性(包括null的)

* 2.如果類上指定 [datacontract],序列化只檢測 屬性有 [datamember] 的

* 3.沒有顯示指定忽略某字段的方式

*///

建立班級

grade gradeone = new grade() ;

gradeone.students = new list();

//新增班級下的學生

student stu = new

student();

stu.id = 1

;stu.name = "張三"

;//設定學生所屬的班級

/** 1.注意:如果當前子類的父類物件引用了當前父類物件丟擲迴圈引用異常

* 解決方法1: 對於需要序列化的類顯示指定契約標識 [datacontract]

* 並且忽略 子類的父類物件,

* 也就是 對 grade 不指定 [datamember]

*//*

* 解決方法2:

* 在類的方法標記使用 [datacontract(isreference = true)]

* isreference:如果使用標準 xml 保留物件引用資料,則為 true;否則為 false

*/stu.grade =gradeone;

gradeone.students.add(stu);

datacontractserializer serializer = new

datacontractserializer(gradeone.gettype());

string result = null

;using (memorystream s = new

memorystream())

}console.writeline(result);

預設設定(出現異常)

public

class

student

public

string name

public grade grade

}public

class

grade

public

string gradename

public liststudents

}

解決方法1,忽略導致迴圈引用的屬性:

這樣的缺點:就是在客戶端獲取到學生物件,不能直接也得到學生所屬的班級物件

[datacontract]

public

class

student

[datamember]

public

string name

[datamember]

public grade grade

}[datacontract]

public

class

grade

[datamember]

public

string gradename

[datamember]

public liststudents

}

序列化結果:

<?

xml version="1.0" encoding="utf-8"

?>

<

grade

xmlns

=""xmlns:i

="">

<

gradeid

>1

gradeid

>

<

gradename

>班級1

gradename

>

<

students

>

<

student

>

<

grade

i:nil

="true"

/>

<

id>1

id>

<

name

>張三

name

>

student

>

students

>

grade

>

解決方法2(推薦),在datacontract上使用isreference引數,並且設定為true,

互操作引用說明:

isreferences:如果使用標準 xml 保留物件引用資料,則為 true;否則為 false。

[datacontract(isreference = true

)]public

class

student

[datamember]

public

string name

[datamember]

public grade grade

}[datacontract(isreference = true

)]public

class

grade

[datamember]

public

string gradename

[datamember]

public liststudents

}

或者在初始化物件的時候指定

datacontractserializer serializer = new datacontractserializer(typeof

(parent),

"parent",

string

.empty,

null

,

int.maxvalue,

false

,

true

,

null

,

null);

序列化結果:

<?

xml version="1.0" encoding="utf-8"

?>

<

grade

xmlns

=""xmlns:i

=""xmlns:z

=""z:id="i1">

<

gradeid

>1

gradeid

>

<

gradename

>班級1

gradename

>

<

students

>

<

student

z:id

="i2"

>

<

gradez:ref

="i1"/>

<

id>1

id>

<

name

>張三

name

>

student

>

students

>

grade

>

物件迴圈引用與序列化問題

最近遇到乙個問題,由於乙個物件內部存在相互引用,導致json序列化失敗.比如定義有乙個類有 class circlereference public void setparam string param public circlereference getreference public void ...

序列化問題

對於ajax來說,只能接收字串,那麼我們在後台的關鍵問題是,如何才能將我們要傳入的資料序列化,使之成為ajax可以接收的資料型別呢?json模組是乙個序列化的辦法,然而json只能序列化python的三大資料型別,元組,列表,字典,對於其他的資料型別,json並不能為我們序列化,那麼我們應該怎麼辦呢...

序列化問題

package cn.edu360 import j a.io.created by zx on 2017 6 25.class maptask extends serializable def m2 line string array string object sertask created b...