前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >“default关键字”与“序列化传输”的注意事项

“default关键字”与“序列化传输”的注意事项

作者头像
菩提树下的杨过
发布2018-01-23 17:18:12
5880
发布2018-01-23 17:18:12
举报

注:此乃“流水帐”式的水文,营养成分较低,高手请自动无视以下内容,否则引起消化不良等症状等,一概不管 ^_^

c#自从3.0开始,提供了很多便捷的语法特性(俗称“语法糖”),以简化程序员的工作量,同时也让编程变得更有乐趣,但是凡事有利必有弊。

比如我们有一个类,希望能序列化成字符串后,以string方式在Silverlight与WCF(或其它后台编程技术)之间传输。

代码语言:javascript
复制
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中的使用代码,示例如下:

代码语言:javascript
复制
string strPerson = new Person().Serialize();

生成的字符串如下:

代码语言:javascript
复制
<?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节点,显然这样的结果不是您所期待的。

原因在于:

代码语言:javascript
复制
public string Name { set; get; }

相当于

代码语言:javascript
复制
private string _name;
public string Name { set { _name = value; } get { return _name; } }

代码语言:javascript
复制
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属性代码应该改成:

代码语言:javascript
复制
private string _name = "";        
public string Name { set { _name = value; } get { return _name; } }

这样才有得到期望的xml字符串:

代码语言:javascript
复制
<?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值:

代码语言:javascript
复制
            //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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011-06-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档