“default关键字”与“序列化传输”的注意事项
注:此乃“流水帐”式的水文,营养成分较低,高手请自动无视以下内容,否则引起消化不良等症状等,一概不管 ^_^
c#自从3.0开始,提供了很多便捷的语法特性(俗称“语法糖”),以简化程序员的工作量,同时也让编程变得更有乐趣,但是凡事有利必有弊。
比如我们有一个类,希望能序列化成字符串后,以string方式在Silverlight与WCF(或其它后台编程技术)之间传输。
using System.IO; using System.Text; using System.Xml.Serialization; namespace XmlClassSerelizer { public class Person { public string Name { set; get; }//这里我们利用了"自动属性"这一语法特性。 public string Serialize() { string result = ""; XmlSerializer xmlSerializer = new XmlSerializer(typeof(Person)); using (MemoryStream ms = new MemoryStream()) { try { xmlSerializer.Serialize(ms, this); result = Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length); } catch { } } return result; } public void DeSerialize(string xmlString) { try { XmlSerializer xmlSerializer = new XmlSerializer(typeof(Person)); Person p = xmlSerializer.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(xmlString))) as Person; if (p != null) { this.Name = p.Name; } } catch { } } } }
在Silverlight中的使用代码,示例如下:
string strPerson = new Person().Serialize();
生成的字符串如下:
<?xml version="1.0" encoding="utf-8"?><Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
即:没有<Name></Name>或<Name/>节点,如果希望生成一个空的Name节点,显然这样的结果不是您所期待的。
原因在于:
public string Name { set; get; }
相当于
private string _name; public string Name { set { _name = value; } get { return _name; } }
或
private string _name = default(string); public string Name { set { _name = value; } get { return _name; } }
而string在CLR中的默认default值为null,在XML序列化的过程中,如果遇到属性为null,不会生成该属性的节点。
因此:若想在new一个对象时,保证所有string类型的属性,最终序列化时在xml结果中必须要有节点,上面的Person类的Name属性代码应该改成:
private string _name = ""; public string Name { set { _name = value; } get { return _name; } }
这样才有得到期望的xml字符串:
<?xml version="1.0" encoding="utf-8"?><Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Name /></Person>
最后,附上一些常用类型的默认default值:
//string s = default(string);//null //DateTime d = default(DateTime);//0001/1/1 00:00:00 //bool b = default(bool);//false //int i = default(int);//0 //double db = default(double);//0.0 //float f = default(float);//0.0
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。