zoukankan      html  css  js  c++  java
  • DataContract 和 DataMember

    数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。

    一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送。

    只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。

    默认情况下,所有公共属性和字段都包含在序列化的JSON中。要省略属性或字段,请使用JsonIgnore属性进行装饰

    public class Product
    {
        public string Name { get; set; }
        public decimal Price { get; set; }
        [JsonIgnore]
        public int ProductCode { get; set; } // omitted
    }

    如果您更喜欢“选择加入(opt-in)”方法,请使用DataContract属性修饰类如果存在此属性,则忽略成员,除非它们具有DataMember您还可以使用DataMember序列化私有成员。

    [DataContract]
    public class Product
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public decimal Price { get; set; }
        public int ProductCode { get; set; }  // omitted by default
    }

    声明为DataMember的成员也可以自定义客户端可见的名称

    除了Name和Namespace以外,DataMember还有以下参数,它们的含义分别如下。

    (1)IsRequired:值为true时,要求序列化引擎检查对象是否存在该值;若无,则会有异常抛出。

    (2)Order:bool类型值,值为true时,序列化和反序列化过程将会按成员定义的顺序进行,这对依赖于成员位置的反序列化过程无比重要。

    (3)EmitDefaultvalue:为成员属性设置一个默认值。

    总结:

    不加的话,默认所有public的属性都要序列化。

    但是加的话,只有标注的属性(或字段)才能序列化,而且即使那个属性是私有的,一样可以序列化,不受任何限制。 

    使用DataContractJsonSerializer进行Json的序列化和反序列化

    引用(Using):

    using System.IO;
    using System.Runtime.Serialization.Json;

    序列化与反序列化:

    /// <summary>
    /// JSON序列化
    /// </summary>
    public static string JsonSerializer<T>(T t)
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream();
        ser.WriteObject(ms, t);
        string jsonString = Encoding.UTF8.GetString(ms.ToArray());
        ms.Close();
        return jsonString;
    }
     
     
    /// <summary>
    /// JSON反序列化
    /// </summary>
    public static T JsonDeserialize<T>(string jsonString)
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
        T obj = (T)ser.ReadObject(ms);
        return obj;
    }
  • 相关阅读:
    SQL0668N 由于表 "db2inst1.test" 上的原因代码 "3",所以不允许操作(解因为LOAD引起的LOAD暂挂状态锁)
    重装系统后,如何恢复DB2数据库?
    db2 导入导出命令大全
    解决tomcat启动时日志出现 javax.naming.NamingException: Invalid byte 1 of 1byte UTF8 sequence.的问题
    【fcntl系统调用】
    C++读书笔记之函数模板
    unix shell笔记
    用setsockopt()来控制recv()与send()的超时 【转】
    Linux守护进程的编程实现 [转]
    GDB调试core文件样例(如何定位Segment fault) 【转】
  • 原文地址:https://www.cnblogs.com/AndyChen2015/p/9602912.html
Copyright © 2011-2022 走看看