精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解F#對(duì)象序列化為XML的實(shí)現(xiàn)方法

開(kāi)發(fā) 后端
在這里我們將討論的是F#對(duì)象序列化為XML的實(shí)現(xiàn)方法,希望對(duì)大家用好F#開(kāi)發(fā)有所幫助。

本文將從F#對(duì)象開(kāi)始,詳細(xì)描述F#對(duì)象序列化為XML的實(shí)現(xiàn)方法,期間還與C#進(jìn)行了對(duì)比。希望通過(guò)本文,能讓大家更好的理解F#。

#T#

這兩天在用F#寫(xiě)一小段代碼,需要把一些對(duì)象存到外部文件中去。這個(gè)功能很容易,因?yàn)?NET本身就內(nèi)置了序列化功能。方便起見(jiàn),我打算將這個(gè)F#對(duì)象序列化成XML而不是二進(jìn)制數(shù)據(jù)流。這意味著我需要使用XmlSerializer而不是BinaryFormatter。這本應(yīng)沒(méi)有問(wèn)題,但是在使用時(shí)候還是發(fā)生了一些小插曲。

定義類型

在F#中有多種定義方式。除了F#特有的Record類型外,在F#中也可以定義普通的“類”,如:

 

  1. #light  
  2. module XmlSerialization  
  3. type Post() =  
  4.     [<DefaultValue>]  
  5.     val mutable Title : string 
  6.     [<DefaultValue>]  
  7.     val mutable Content : string 
  8.     [<DefaultValue>] 

val mutable Tags : string array上面的代碼在XmlSerialization模塊中定義了一個(gè)Post類,其中包含三個(gè)公開(kāi)字段。簡(jiǎn)單地說(shuō),它和C#中的如下定義等價(jià):

 

  1. public class Post  
  2. {  
  3.     public string Title;  
  4.     public string Content;  
  5.     public string[] Tags;  

可見(jiàn),在定義這種簡(jiǎn)單類型時(shí),F(xiàn)#并沒(méi)有什么優(yōu)勢(shì),反而需要更多的代碼。

使用XmlSerializer進(jìn)行序列化

原本我以為使用XmlSerializer來(lái)序列化一個(gè)對(duì)象非常容易,寫(xiě)一個(gè)簡(jiǎn)單的(泛型)函數(shù)就可以了:

  1. let byXmlSerializer (graph: 'a) =  
  2.     let serializer = new XmlSerializer(typeof<'a>)  
  3.     let writer = new StringWriter()  
  4.     serializer.Serialize(writer, graph)  
  5.     writer.ToString() 

使用起來(lái)更加不在話下:

 

  1. let post = new XmlSerialization.Post()  
  2. post.Title <- "Hello" 
  3. post.Content <- "World" 
  4. post.Tags <- [| "Hello""World" |]  
  5. let xml = XmlSerialization.byXmlSerializer(post) 

但是,在運(yùn)行的時(shí)候,XmlSerializer的構(gòu)造函數(shù)卻拋出了InvalidOperationException:

XmlSerialization cannot be serialized. Static types cannot be used as parameters or return types.
這句話的提示似乎是在說(shuō)XmlSerialization是一個(gè)靜態(tài)類型——但這其實(shí)是F#的模塊啊。不過(guò)使用.NET Reflector查看編譯后的程序集便會(huì)發(fā)現(xiàn),其實(shí)Post類是這樣定義的:

  1. public static class XmlSerialization  
  2. {  
  3.     public class Post { ... }  

雖然.NET中也有“模塊”的概念,但是它和F#中的模塊從各方面來(lái)講幾乎沒(méi)有相同之處。F#的模塊會(huì)被編譯為靜態(tài)類,自然模塊中的方法或各種函數(shù)便成為靜態(tài)類中的內(nèi)嵌類型及方法。這本沒(méi)有問(wèn)題,從理論上來(lái)說(shuō)XmlSerializer也不該有問(wèn)題,不是嗎?

可惜XmlSerializer的確有這樣的問(wèn)題,我認(rèn)為這是個(gè)Bug——但就算這是個(gè)Bug也無(wú)法解決目前的狀況。事實(shí)上,互聯(lián)網(wǎng)上也有人提出這個(gè)問(wèn)題,可惜半年來(lái)都沒(méi)有人回應(yīng)。

手動(dòng)序列化

那么我又該怎么做呢?我想,算了,既然如此,我們進(jìn)行手動(dòng)序列化吧。反正就是簡(jiǎn)單的對(duì)象,寫(xiě)起來(lái)應(yīng)該也不麻煩。例如在C#中我們便可以:

 

  1. public class Post  
  2. {  
  3.     ...  
  4.     public string ToXml()  
  5.     {  
  6.         var xml =   
  7.             new XElement("Post",  
  8.                 new XElement("Title"this.Title),  
  9.                 new XElement("Content"this.Content),  
  10.                 new XElement("Tags",  
  11.                     this.Tags.Select(t => new XElement("Tag", t))));  
  12.         return xml.ToString();  
  13.     }  

很簡(jiǎn)單,不是嗎?但是用F#寫(xiě)同樣的邏輯便有一些問(wèn)題了,最終得到的結(jié)果是:

 

  1. type Post() =   
  2.     ...  
  3.  
  4.     member p.ToXml() =  
  5.         let xml = new XElement(XName.Get("Post"))  
  6.         xml.Add(new XElement(XName.Get("Title"), p.Title))  
  7.         xml.Add(new XElement(XName.Get("Content"), p.Content))  
  8.  
  9.         let tagElements = p.Tags |> Array.map (fun t -> new XElement(XName.Get("Tag"), t))  
  10.         xml.Add(new XElement(XName.Get("Tags"), tagElements))  
  11.           
  12.         xml.ToString() 

C#之所以可以寫(xiě)的簡(jiǎn)單,其中有諸多因素:

XElement的構(gòu)造函數(shù)***使用了params object[],這意味著我們可以把參數(shù)“羅列”出來(lái),而不需要顯式地構(gòu)造一個(gè)數(shù)組。

XElement的構(gòu)造函數(shù)接受的其實(shí)是XName類型參數(shù),但字符串可以被隱式地轉(zhuǎn)化為XName類型。

XElement的構(gòu)造函數(shù)可以將IEnumerable<XElement>對(duì)象轉(zhuǎn)化為獨(dú)立的元素。 但是,除了***一條外,其他兩個(gè)特性在F#里都無(wú)法享受到。因此,我們只能用命令式編程的方式編寫(xiě)此類代碼。您可以發(fā)現(xiàn),這樣的F#代碼幾乎可以被自動(dòng)轉(zhuǎn)化為Java代碼。F#在寫(xiě)這樣的代碼時(shí)實(shí)在沒(méi)有優(yōu)勢(shì)。

使用DataContractSerializer

手動(dòng)進(jìn)行XML序列化雖然并不困難,但是實(shí)在麻煩。這不是一種通用的做法,我們必須為每個(gè)類型各寫(xiě)一套序列化(和反序列化)邏輯,在類型字段有所改變的時(shí)候,序列化和反序列化的邏輯還必須有所變化。就在我打算寫(xiě)一個(gè)簡(jiǎn)單的,通用的XML序列化方法時(shí),我忽然想到以前看到過(guò)的一篇文章,說(shuō)是在.NET 3.0中發(fā)布了新的類庫(kù):DataContractSerializer。

DataContractSerializer看似和WCF有關(guān),如DataContractAttribute,DataMemberAttribute等標(biāo)記最典型的作用也一直用在WCF里。但事實(shí)上,這些類型都是定義在System.Runtime.Serialization.dll中的,這意味著這些功能從設(shè)計(jì)之初與WCF分離開(kāi)來(lái),可以獨(dú)立使用。那么我們不如嘗試一下吧:

  1. let serialize (graph : 'a) =   
  2.     let serializer = new DataContractSerializer(typeof<'a>)  
  3.     let textWriter = new StringWriter();  
  4.     let xmlWriter = new XmlTextWriter(textWriter);  
  5.     serializer.WriteObject(xmlWriter, graph)  
  6.     textWriter.ToString() 

果然好用,DataContractSerializer并沒(méi)有出現(xiàn)XmlSerializer那樣傻乎乎地錯(cuò)誤。自然,與之相對(duì)的反序列化函數(shù)也很容易寫(xiě):

  1. let deserialize<'a> xml =   
  2.     let serializer = new DataContractSerializer(typeof<'a>)  
  3.     let textReader = new StringReader(xml)  
  4.     let xmlReader = new XmlTextReader(textReader)  
  5.     serializer.ReadObject(xmlReader) :?> 'a 

試驗(yàn)一下,看看效果?

 

  1. let post = new XmlSerialization.Post()  
  2. post.Title <- "Hello" 
  3. post.Content <- "World" 
  4. post.Tags <- [| "Hello""World" |]  
  5.  
  6. let xml = XmlSerialization.serialize post  
  7. let post' = XmlSerialization.deserialize<XmlSerialization.Post> xml 

經(jīng)過(guò)更多試驗(yàn),我發(fā)現(xiàn)DataContractSerializer對(duì)于復(fù)雜類型的字段也可以正常應(yīng)對(duì),而得到這些功能也只需要在目標(biāo)類型上標(biāo)記一個(gè)SerializableAttribute就行了,更細(xì)節(jié)的控制也可以通過(guò)DataContractAttribute等進(jìn)行控制。這樣看來(lái),XmlSerializer似乎已經(jīng)可以退出歷史舞臺(tái)了?

原文標(biāo)題:F#中的XML序列化

鏈接: http://www.cnblogs.com/JeffreyZhao/archive/2010/01/03/fsharp-xml-serialization.html

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-11-16 09:05:46

CodeTimer

2009-02-24 10:09:02

XMLJava對(duì)象

2009-09-09 15:47:27

XML序列化和反序列化

2012-04-13 10:45:59

XML

2009-09-09 14:45:41

XML序列化和反序列化

2010-04-07 16:51:59

F#

2010-01-26 08:25:06

F#語(yǔ)法F#教程

2011-06-01 15:05:02

序列化反序列化

2021-11-18 11:48:46

ObjectInputJava

2009-08-19 09:42:34

F#并行排序算法

2018-03-19 10:20:23

Java序列化反序列化

2011-05-18 15:20:13

XML

2009-06-14 22:01:27

Java對(duì)象序列化反序列化

2009-09-09 17:14:24

XML序列化

2010-01-07 10:04:18

F#函數(shù)式編程

2011-06-01 14:26:11

序列化

2009-08-06 11:16:25

C#序列化和反序列化

2010-01-15 08:33:13

F#F#類型推斷F#教程

2010-03-16 09:09:04

F#

2010-01-08 13:25:07

ibmdwXML
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国模大尺度视频| 国产精品久久久对白| 日本精品久久久久中文| 2019中文亚洲字幕| 亚洲自拍与偷拍| 久久婷婷国产综合尤物精品| 中文永久免费观看| 欧美精品三区| 在线精品高清中文字幕| 亚洲欧美激情一区二区三区| 97se综合| 亚洲一区二区三区四区不卡| 欧美午夜免费| 性少妇videosexfreexxx片| 久久尤物视频| 久久6免费高清热精品| 成人性生交大免费看| 亚洲天堂av资源在线观看| 在线视频亚洲一区| 阿v天堂2018| 黄网站免费在线观看| av影院午夜一区| 91久久久久久久久久久| 国产精品久久久久久久久久精爆| 中文精品电影| 在线播放国产精品| www.色多多| 视频一区日韩精品| 欧美精品久久天天躁| 国产又大又硬又粗| 91福利在线免费| 亚洲日本韩国一区| 神马影院午夜我不卡| 天天操天天射天天舔| 国产九九视频一区二区三区| 国产精品久久久久久久av大片 | 亚洲欧美日韩中文字幕一区二区三区| 欧美激情国产日韩| 四虎永久在线精品免费网址| 国产福利一区二区三区| 国产精品美女免费| 无码人妻黑人中文字幕| 亚洲男人影院| 欧美高跟鞋交xxxxxhd| 亚洲综合久久av一区二区三区| 亚洲福利天堂| 日韩精品亚洲元码| 午夜av免费看| 同性恋视频一区| 亚洲国产日韩欧美综合久久| 精品人妻二区中文字幕| 麻豆国产一区二区三区四区| 欧美丰满美乳xxx高潮www| 国产嫩草在线观看| 欧美影视资讯| 欧美性高清videossexo| www日韩视频| 经典三级一区二区| 欧美午夜寂寞影院| 91人人澡人人爽人人精品| 日本综合视频| 欧美三级资源在线| 国产无色aaa| 精品国产亚洲一区二区三区在线 | 久久99国产精品视频| 日韩高清免费在线| 久久精品成人av| 国产日产精品_国产精品毛片| 亚洲精品中文字幕有码专区| 久久午夜福利电影| 日韩精品水蜜桃| 另类专区欧美制服同性| 免费中文字幕在线观看| 99成人精品| 日韩av毛片网| 亚洲一区二区影视| 国产一区二区日韩精品| 国产精品视频一区二区三区经| 日本高清视频在线| 久久久高清一区二区三区| 色99中文字幕| a级在线观看| 欧美日韩国产色| 欧美大尺度做爰床戏| 韩国三级大全久久网站| 亚洲精美色品网站| 战狼4完整免费观看在线播放版| 天天综合一区| 97久久精品视频| 天堂av免费在线观看| 经典一区二区三区| 国产一区二区在线观看免费播放| 国产视频网址在线| 一区二区三区中文字幕在线观看| a在线视频观看| 国外成人福利视频| 亚洲成人av中文字幕| 无码 人妻 在线 视频| 91精品1区| 国产91精品久| 国产婷婷在线视频| 91网站黄www| 日本精品免费视频| 欧美黑人粗大| 日韩欧美成人激情| 九九热免费在线| 欧美视频在线观看| 国产精品高精视频免费| 黄色福利在线观看| 亚洲欧美综合色| 97成人在线观看视频| 视频一区中文字幕精品| 中文字幕精品在线| 在线观看免费国产视频| 韩国av一区二区三区在线观看| 精品在线一区| 黄色成人在线网| 欧美日韩激情在线| wwwwxxxx国产| 亚洲第一区色| 丁香五月网久久综合| 在线观看精品一区二区三区| 欧美性xxxx极品hd满灌| 中文字幕永久免费| 亚洲成av人片乱码色午夜| 国产成人福利视频| 婷婷丁香花五月天| 亚洲一区二区三区四区不卡| 一区二区三区四区毛片| 成人3d精品动漫精品一二三| 欧美重口另类videos人妖| 亚洲不卡免费视频| 亚洲欧美电影院| 网站一区二区三区| 欧美自拍偷拍| 国产国语刺激对白av不卡| 亚州精品国产精品乱码不99按摩| 亚洲中国最大av网站| 91网址在线观看精品| 日韩精品一区二区久久| 国产精品大片wwwwww| 欧美日韩视频精品二区| 高跟丝袜欧美一区| 国产福利短视频| 国产精品嫩草99av在线| 精品国产一区二区三| av中文字幕在线看| 日韩av在线免费| 成年人免费看毛片| 成人av免费在线| 东北少妇不带套对白| swag国产精品一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品欧美激情在线| 国产精品国模大尺度视频| 伊人色在线观看| 91精品秘密在线观看| 亚洲a级在线播放观看| 亚洲小说区图片| 精品久久久久一区| 国产成人无码一区二区三区在线| av一区二区三区黑人| 久久精品国产精品亚洲色婷婷| 色婷婷久久久| 日本一本a高清免费不卡| 国产精品二线| 欧美日韩夫妻久久| 免费视频网站www| 99r精品视频| 无码内射中文字幕岛国片| 91视频精品| 99久久综合狠狠综合久久止| 女人高潮被爽到呻吟在线观看| 日韩av在线免费播放| 国产无遮挡又黄又爽又色视频| 国产精品久久久久一区| 久久艹这里只有精品| 亚洲成人中文| 日韩一区二区电影在线观看| 国产aa精品| 97视频在线免费观看| 国产福利免费在线观看| 欧美一区二区三区小说| 999这里只有精品| 国产亚洲短视频| 日韩av福利在线观看| 在线亚洲免费| 亚洲资源在线网| 国产伦精品一区二区三区在线播放| 欧美在线激情网| 精品国产白色丝袜高跟鞋| 亚洲福利视频免费观看| 中文字幕永久免费视频| 亚洲午夜一区二区| www中文在线| 99久久久国产精品免费蜜臀| 亚洲精品午夜在线观看| 在线日韩中文| 一区二区三区欧美在线| 狼人天天伊人久久| 成人av在线天堂| 神马久久午夜| 蜜臀久久99精品久久久久久宅男| 日本亚洲一区| 欧美成人精品高清在线播放| 在线视频精品免费| 香蕉影视欧美成人| 免费看一级大片| 国产欧美一区二区精品性| 亚洲成人精品在线播放| 麻豆视频观看网址久久| 国产中文字幕免费观看| 欧美日韩在线大尺度| 先锋影音网一区| 日韩有码av| 成人国产1314www色视频| 国产成人精品一区二区三区免费| 欧美在线亚洲在线| 国产网红在线观看| 欧美大胆在线视频| 日本高清在线观看wwwww色| 亚洲男人的天堂在线播放| 丰满人妻一区二区三区无码av| 精品1区2区3区| 精品久久久久久久久久久久久久久久久久| 一区二区三区四区激情| 美国黄色片视频| 中文字幕va一区二区三区| 成年人在线观看av| 97久久久精品综合88久久| 欧洲成人午夜精品无码区久久| 久色婷婷小香蕉久久| 性chinese极品按摩| 丝袜诱惑亚洲看片| 久久精品午夜福利| 欧美一级专区| 青青草原av在线播放| 一本色道精品久久一区二区三区| 日本一级黄视频| 欧美日韩三级电影在线| 日本福利视频在线观看| 亚洲免费二区| 中国女人做爰视频| 亚洲成人国产| 可以免费看的黄色网址| 中文视频一区| 欧美 国产 精品| 亚洲综合婷婷| 欧美a级免费视频| 国产综合亚洲精品一区二| 300部国产真实乱| 欧美日韩国产一区精品一区| 欧美日韩激情四射| 国内精品久久久久久久影视蜜臀| 日韩欧美精品免费| 在线日韩av| 欧洲av无码放荡人妇网站| 久久精选视频| 一女二男3p波多野结衣| 黄色资源网久久资源365| 污污视频在线免费| 粉嫩av一区二区三区| 国产二级一片内射视频播放| 91网站最新网址| 东京热无码av男人的天堂| 国产精品理伦片| 欧美三根一起进三p| 无码av免费一区二区三区试看| 日韩精品在线观看免费| 欧美综合在线视频| 国产99视频在线| 亚洲黄色有码视频| 国产天堂在线| 精品少妇v888av| 成人性教育av免费网址| 国产精品亚发布| caoporn成人免费视频在线| 久久亚洲高清| 国产精品久久久久久麻豆一区软件 | 国产视频在线视频| 国产一区视频在线看| 大乳护士喂奶hd| 国产亚洲欧美在线| 黄色一级片中国| 日韩欧美中文免费| 国产裸体永久免费无遮挡| 欧美精品一区二区三区很污很色的| 久久精品蜜桃| 久久在线精品视频| 亚洲色图官网| 91久久久久久久久久久| 亚洲第一福利社区| 午夜啪啪福利视频| 蜜桃av综合| 久久精品aⅴ无码中文字字幕重口| 久久综合九色综合久久久精品综合| 国产精品久久久免费看| 午夜日韩在线观看| 国产精品久久久久久久免费看| 亚洲黄页网在线观看| 免费网站成人| 青青草成人在线| 无人区乱码一区二区三区| 日韩影视精品| 国产农村妇女毛片精品久久莱园子 | 欧美一区免费视频| 国内精品美女在线观看| 男女无套免费视频网站动漫| 成人性生交大片免费看中文| 美女100%露胸无遮挡| 精品国产福利在线| 国产视频手机在线观看| 伊是香蕉大人久久| 在线最新版中文在线| 99久久久久国产精品免费| 久久视频在线| 噼里啪啦国语在线观看免费版高清版 | 日本欧美爱爱爱| 国产女人18毛片水真多18精品| 伊人久久大香线蕉午夜av| 老司机午夜精品视频| 黄色污在线观看| 亚洲一区二区视频| 国产日韩在线观看一区| 精品国偷自产在线视频99| 日本欧美韩国| 欧美系列一区| 亚洲欧美日韩一区在线观看| 亚洲美女高潮久久久| 亚洲免费成人av| 国产精品一级二级| 日韩在线视频播放| 日本欧美不卡| 日韩国产欧美一区| 视频一区二区三区在线| 在线不卡av电影| 日韩欧美一区视频| 人人九九精品| 日韩美女视频中文字幕| 亚洲aa在线| 色诱视频在线观看| 国产婷婷色一区二区三区四区 | 丝袜a∨在线一区二区三区不卡| 网站免费在线观看| 欧美日韩综合视频网址| 手机亚洲第一页| 日本一区二区在线免费播放| 久久97视频| 浓精h攵女乱爱av| 中文字幕一区视频| a级片在线免费看| 欧美黑人巨大xxx极品| 国产精品jk白丝蜜臀av小说| 亚洲人成无码网站久久99热国产 | 337p亚洲精品色噜噜| 成人在线网址| 国产成人精品福利一区二区三区| 激情久久五月| 欧美深性狂猛ⅹxxx深喉| 精品动漫一区二区三区| 久久久pmvav| 国产精品在线看| 欧美在线91| 久久久老熟女一区二区三区91| 狠狠色噜噜狠狠狠狠97| 免费黄色在线视频网站| 国产精品视频最多的网站| 亚洲澳门在线| 亚洲精品乱码久久久久久久| 91福利精品第一导航| 欧美尤物美女在线| www.成人av| 久久久久久穴| 日韩三级在线观看视频| 亚洲精品在线观看视频| 韩国成人在线| 四虎精品欧美一区二区免费| 99精品视频一区二区| 中文 欧美 日韩| 欧美精品xxx| 韩日一区二区三区| 亚洲一区二区三区四区精品| 亚洲成av人片一区二区三区| 国产三级在线| 成人免费看片网址| 日韩不卡一区二区三区| 中文字幕手机在线观看| 精品亚洲国产视频| 国产美女亚洲精品7777| 免费成人在线视频网站| 一色桃子久久精品亚洲| 婷婷av一区二区三区| 国产专区精品视频| 国产日韩亚洲欧美精品| 99鲁鲁精品一区二区三区| 日韩激情av在线免费观看| 亚洲三级在线| 无码无遮挡又大又爽又黄的视频| 亚洲人123区| 岛国最新视频免费在线观看|