zoukankan      html  css  js  c++  java
  • “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
    
  • 相关阅读:
    设计模式之桥接模式
    设计模式之观察者模式
    设计模式之装饰者模式
    设计模式之适配器模式
    2 深入分析 Java IO的工作机制(二)
    struts2常用标签使用说明
    JDK环境变量配置
    Oracle恢复删除数据 && connect by 树形结构查询
    Spring和Hibernate集成配置
    Struts2中重定向和请求转发配置
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/2090425.html
Copyright © 2011-2022 走看看