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

简介: 注:此乃“流水帐”式的水文,营养成分较低,高手请自动无视以下内容,否则引起消化不良等症状等,一概不管 ^_^   c#自从3.0开始,提供了很多便捷的语法特性(俗称“语法糖”),以简化程序员的工作量,同时也让编程变得更有乐趣,但是凡事有利必有弊。
注:此乃“流水帐”式的水文,营养成分较低,高手请自动无视以下内容,否则引起消化不良等症状等,一概不管 ^_^

 

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
目录
相关文章
|
1月前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
设计模式 JSON Java
RPC框架(3 - 实现Netty传输和通用序列化接口)
RPC框架(3 - 实现Netty传输和通用序列化接口)
|
缓存
使用transient关键字解决ehcache序列化错误
使用Ehcache时发现个不起眼的小问题 在一个Model中有以下代码: public class MyModel implements Serializable { private static final long serialVersionUID = -990334519...
1330 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
18天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
28天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。