成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WCF DataContract標記去除方式解析

開發 開發工具
WCF DataContract標記的應用在實際編程開發中有時會比較麻煩,那么如何才能省略掉這一標記又不影響程序開發呢?在這里將會一一介紹。

WCF是一個基于.Net Framework 2.0基礎的由微軟公司研發的開發插件,它的實際應用可以幫助編程人員輕松實現特定的功能需求。在這里我們將會介紹一種應用技巧,就是如何在使用中省略掉WCF DataContract標記。#t#

寫過WCF程序的朋友都知道,在對實體對象在WCF和客戶端之間傳遞時一定要加WCF DataContract標記這個類并用DataMember來標記要序列化的屬性/字段。這一直正確,只是在.NET Framework 3.5 SP1中新添加了一些支持,那就是你不一定必須對這些實體對象應用DataContract標記,這被稱作對plain old C# objects(POCO)的序列化支持。

 

Serializable標記大家都很熟悉,它是XmlSerializer的標記,在WCF中其實很少用這個標記,因為我們WCF用的是DataContractSerializer,對應的標記也是DataContract。但對于SP1來說,Serializable也以XmlSerializer的規則被正常解析,其對應的Mapping規則和Serializer對應,其公有可讀寫字段被默認序列化。當然,你也可以通過XmlElement等標記來做高級映射,但這不是我們這里需要談及的內容。

 

WCF DataContract標記對應的序列化處理叫做DataContactSerializer。在WCF中一旦一個類被標記為DataContract,那么只有標記為DataMember的字段/屬性才會被序列化。但如果你使用DataContract標記,那么DataContractSerializer默認將所有公有可讀寫字段序列化(這和Serializable是一樣的)。假設我們有這么一個類:

 

  1. public class Person  
  2. {  
  3. public Person()  
  4. { }  
  5. public Person(string strId, string strName)  
  6. {  
  7. this.Id = strId;  
  8. this.Name = strName;  
  9. }  
  10. private string strid;  
  11. public string Id { get { return strid; } set { strid = value; } }  
  12. public string Name;  
  13. public Person Spouse;  
  14. private int Number = 343;  

 

 

對于DataSerializer來說,他和給所有公有屬性添加DataMember并將類標記為WCF DataContract標記是一樣的。下面的一段程序分別將一個Person的實例對象分別用XmlSerializer和DataContractSerializer來序列化:

 

  1. static void Main(string[] args)  
  2. {  
  3. Person p = new Person();  
  4. p.Id = "123";  
  5. p.Name = "Aaron";  
  6. p.Spouse = new Person();  
  7. p.Spouse.Id = "456";  
  8. p.Spouse.Name = "Monica";  
  9. DataContractSerializer dcs = new 
    DataContractSerializer(typeof(Person));  
  10. using (FileStream fs = new FileStream("person.xml", 
    FileMode.Create))  
  11. {  
  12. dcs.WriteObject(fs, p);  
  13. }  
  14. XmlSerializer xs = new XmlSerializer(typeof(Person));  
  15. using (FileStream fs = new FileStream("person_serialization.xml",
     FileMode.Create))  
  16. {  
  17. xs.Serialize(fs, p);  
  18. }  

 

對于序列化后的內容我們得到的結果其實是一樣的:僅有公有屬性/字段被序列化

 

  1. < Person xmlns="http://schemas.datacontract.org/2004/07/
    Serialization"
     xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
  2. < Id>123< /Id> 
  3. < Name>Aaron< /Name> 
  4. < Spouse> 
  5. < Id>456< /Id> 
  6. < Name>Monica< /Name> 
  7. < Spouse i:nil="true"/> 
  8. < /Spouse> 
  9. < /Person> 

 

但如果你使用了DataContract來標記這個類,卻沒有使用DataMember,那么沒有任何屬性/字段被序列化:

 

  1. [DataContract]  
  2. public class Person  
  3. {  
  4. private string strid;  
  5. public string Id { get { return strid; } set { strid = value; } }  
  6. public string Name;  
  7. public Person Spouse;  
  8. private int Number = 343;  
  9. }  
  10. < Person xmlns="http://schemas.datacontract.org/2004/07/
    Serialization"
     xmlns:i=http://www.w3.org/2001/XMLSchema-instance /> 

 

 

對于將類標記成Serializable,DataContractSerializer的序列化可能讓我們覺得有些奇怪,它本質上是將所有可讀寫字段序列化,這其中還包括私有字段。例如我們將Person類用[Serializable]標記,執行程序,我們會得到以下的結果:

 

  1. < Person xmlns="http://schemas.datacontract.org/2004/07
    /Serialization"
     xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
  2. < Name>Aaron< /Name> 
  3. < Number>0< /Number> 
  4. < Spouse> 
  5. < Name>Monica< /Name> 
  6. < Number>0< /Number> 
  7. < Spouse i:nil="true"/> 
  8. < _id>456< /_id> 
  9. < /Spouse> 
  10. < _id>123< /_id> 
  11. < /Person> 

 

一個簡單的WCF程序來看看來檢驗一下是否正確。在Contract生命中我們并不需要制定任何的標記,并聲明一個得到DeskMesh的方法:

 

  1. [ServiceContract]  
  2. public interface IDeskMesh  
  3. {  
  4. [OperationContract]  
  5. DeskMesh GetDeskMesh(string name);  
  6. }  
  7. public class DeskMesh  
  8. {  
  9. private int _id;  
  10. private int Number = 4433;  
  11. public int ID  
  12. {  
  13. get { return _id; }  
  14. set { _id = value; }  
  15. }  
  16. public string Name { get; set; }  
  17. public string Description { get; set; }  
  18. public string Unit { get; set; }  
  19. public float Price { get; set; }  
  20. public DateTime Created { get; set; }  
  21. public override string ToString()  
  22. {  
  23. return string.Format("ID:{4}"r"nName: {0}"r"nUnit:{1}"r"
    nPrice:{2}"r"nCreated:{3}"r"nNumber:{5}",  
  24. Name, Unit, Price, Created.ToShortDateString(),
    ID.ToString(),Number.ToString());  
  25. }  

 

 

客戶端調用,會返回一個DeskMesh的實例。通過結果,你會發現這完全和你標記WCF DataContract標記的實體在WCF兩端傳遞一模一樣。

 

  1. void Main(string[] args)  
  2. {  
  3. Console.WriteLine("Requesting...");  
  4. ServiceClient client = new ServiceClient();  
  5. DeskMesh mesh = client.GetDeskMesh("");  
  6. Console.WriteLine(mesh.ToString());  
  7. Console.WriteLine("press any key to continue...");  
  8. Console.Read();  

 

 

總結一下吧,WCF中應用各個標記時所作的序列化處理:

1. 不給任何標記將會做XML映射,所有公有屬性/字段都會被序列化

2. [Serializable]標記會將所有可讀寫字段序列化

3. [DataContract]和[DataMember]聯合使用來標記被序列化的字段

以上就是對WCF DataContract標記的相關介紹。

責任編輯:曹凱 來源: 博客園
相關推薦

2010-03-02 16:09:53

WCF框架

2009-12-22 13:25:58

WCF性能計數器內存

2010-01-20 17:41:13

VB.NET標記語句

2010-02-26 14:05:57

WCF通信方式

2010-02-22 14:18:34

WCF服務驗證

2009-12-22 15:14:33

WCF調用

2010-02-23 10:51:32

WCF Address

2010-02-22 14:53:17

WCF用戶密碼

2009-11-05 16:12:09

WCF會話服務

2009-12-07 09:32:44

WCF開源

2010-02-22 10:18:18

WCF配置文件

2009-12-07 09:58:35

WCF性能

2010-02-22 14:09:08

WCF Dispose

2010-02-22 17:21:02

WCF消息交換

2010-02-26 14:12:27

WCF元數據

2010-03-01 16:59:31

WCF異常調試

2010-03-02 16:05:48

WCF端點配置

2010-02-26 17:44:51

WCF安全參數

2010-03-01 15:51:01

WCF限流

2010-02-24 10:07:48

WCF跨越邊界
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久久精品免费看国产四区 | 日韩精品一区二区三区 | 日本aaaa| 99日韩| 91在线电影 | 男女视频91| 欧美一级淫片免费视频黄 | 麻豆精品国产91久久久久久 | 天堂色综合 | 天天天堂 | 欧美在线观看一区 | 久久久久久综合 | 久久国产一区二区三区 | 国产精品18hdxxxⅹ在线 | 精品区一区二区 | 国产偷录叫床高潮录音 | 成人不卡在线 | 欧美日韩国产一区二区 | 91精品国产欧美一区二区成人 | 亚洲一区视频在线 | 琪琪午夜伦伦电影福利片 | 日韩精品福利 | 国产精品1区 | 亚洲国产成人精品女人久久久 | 久久国产精品亚洲 | 午夜成人在线视频 | 亚洲欧美日韩电影 | 亚洲国产精品久久久久秋霞不卡 | 日韩影院在线 | 国产成人精品久久二区二区91 | 视频一区二区在线观看 | 亚洲精品观看 | 精品国产一区二区三区性色 | 日韩在线精品视频 | 特级a欧美做爰片毛片 | 欧美日韩在线成人 | 精品欧美一区二区三区久久久小说 | 午夜精品一区 | 别c我啊嗯国产av一毛片 | 欧美国产精品一区二区三区 | 免费一区在线观看 |