2017-08-09 53 views
0

ProtoContract屬性 - AsReferenceDefaultProtoMemberAttribute屬性AsReference有什麼區別?Protbuf-net:ProtoMemberAttribute.AsReference和ProtoContract.AsReferenceDefault之間的區別是什麼

按照wiki

AsReference - 使子對象的參考跟蹤;這使用了一個非常不同的序列化佈局,但是隻會對該對象進行一次序列化(爲其提供唯一的引用標記)。這允許 全圖支持否則循環圖。這也可以用來 有很大的影響,以有效地存儲公用字符串以其他方式 數據

重複很多次,但它是如何涉及到ProtoContract屬性:AsReferenceDefault

例如,如果將AsReferenceDefault設置爲true,是不是意味着ProtoMemberAttribute屬性AsReference不再需要?

回答

2

是的,如果AsReferenceDefault應用於類,它將始終序列化爲引用,即使相應的屬性尚未在ProtoMemberAttribute上聲明AsReference

理想情況下,對於您的大班級,您確定該對象很大,最好將其作爲參考序列化一次,以便將其標記爲AsReferenceDefault

AsReference設計用於處理參考序列化,即使它不是您自己的類,例如String

+0

是的,我以這種方式思考,但在我們的代碼中,有很多循環引用,所以'AsReferenceDefault'應該處理它,但不幸的是,它沒有,但添加了'AsReference'後它起作用(例如AsReference是'列表'設置爲'true',但MyEntity'已經擁有它)。所以看起來像有一些差異,我不知道什麼 – GSerjo

+0

沒有,名單不會'AsReferenceDefault',即使'MyEntity'是'AsReferenceDefault',如果你有一個類'MyEntityList:List ',你可以標記'MyEntityList' as'AsReferenceDefault' –

+0

是的,但它確實沒有在屬性列表上添加'AsReference = true''我有一個異常(檢測到遞歸)。目前,我有'StackOverflow異常'和每調用堆棧protobuf試圖序列化相同的對象(數據有周期引用),但同時'AsReferenceDefault = true'。我對AsReference行爲有點好奇,這有點意外 – GSerjo

相關問題