您的位置:首页 > Web前端 > JavaScript

学习之路十一:JSON(序列化与反序列化)

2012-04-13 21:14 162 查看
   最近公司项目中用到了Json操作,从.NET后台读取数据,通过Json转化在传给“Andiron”端呈现,于是通过几天的学习,对它有了一点的理解!

   [b]1.Json的理解[/b]

    Json其实就是一个序列化和反序列化的操作,而通过序列化操作之后的数据可以跨平台使用,这就促使了可以使用两个平台,一个做后台,一个做前台,数据访问层通过Json来传递!

  [b]2.可以序列化的标志   [/b] 

  [Serializable]
     public class MyPeople
{
public string Name { get; set; }

public string FatherName { get; set; }
   }


    从上面代码可以看出要通过添加[Serializable]特性来标志这个对象是可以序列化的!    

    [NonSerialized] 特性,如果在你的属性上面加上这个特性,就表示这个属性将不会被序列化!

  [b]3.什么是序列化和可序列化[/b]

    序列化首先从内存或其它文件中(MemorySteam或FileStream等)中把对象读取出来并通过一定方式进行序列化,最后进行输出!

    反序列化首先会通过流操作(MemorySteam或FileStream等)读取传过来的值把它写入内存或文件中,然后通过一定序列化方式转化流对象 → 实体对象!

    推荐文章 → [Serializable]在C#中的作用-NET 中的对象序列化

  [b]4.使用二进制(BinaryFormatter)进行序列化[/b]

    4.1序列化

    MyPeople myPeople = new MyPeople() { Name = "yangcaogui", FatherName = "caoxiaolong" };
IFormatter binaryFormatter = new BinaryFormatter();
using (Stream stream = new FileStream("one.txt", FileMode.Create, FileAccess.Write, FileShare.None))  //也可以使用MemoryStream内存流
{
binaryFormatter.Serialize(stream, myPeople);
stream.Close();
}


    4.2反序列化

   IFormatter binaryFormatter = new BinaryFormatter();
using (Stream streamOne = new FileStream("one.txt", FileMode.Open, FileAccess.Read, FileShare.None))
{
MyPeople myPeopleOne = (MyPeople)binaryFormatter.Deserialize(streamOne);
Console.WriteLine(myPeopleOne.Name + "\t" + myPeopleOne.FatherName);
}


  [b]5.使用SoapFormatter进行序列化[/b]

    这个跟二进制序列化不一样的地方是 → 最后的数据是以XML的形式存在!

    5.1序列化

    View Code
    Note除了XmlSerializer序列化调用的方法是“Deserialize”,其它的序列化都是使用“ReadObject”进行反序列化操作!

  [b]8.一般的Json数据格式[/b][b]    [/b]

    


  [b]9.理解序列化操作  [/b]  

    下午在写公共类库的时候发现序列化其实就是流操作序列化算法的结合,不管你使用哪一种流操作,最重要的还是你使用的是哪一种序列化算法,有“BinaryFormatter”,“SoapFormatter”,“XmlSerializer”,“DataContractSerialize”,“DataContractJsonSerializer”,“NetDataContractSerializer” 等,它们在序列化之后的格式有一定的差异!

  [b]10.关于Json序列化时间的问题[/b]

    没接触过不知道问题所在,接触过了才能猛然醒悟!

    ①如果把时间设置为“String”类型,如下:

    


    ②如果直接设置为“DataTime”,如下:

    


 [b] 11.简单的封装Json操作类,解决时间问题 [/b]

   public static class JsonOperation<T>
{
private static readonly DataContractJsonSerializer DataContractJsonSerializer = new DataContractJsonSerializer(typeof(T));

//序列化
public static string JsonSerializeOperation(T obj)
{
if (obj == null)
throw new Exception();
string str = "";
using (MemoryStream memoryStream = new MemoryStream())
{
DataContractJsonSerializer.WriteObject(memoryStream, obj);
str = Encoding.UTF8.GetString(memoryStream.ToArray());
}
return ConvertJsonTimeToDateTime(str);
}

//反序列化
public static T JsonDeserializeOperation(string str)
{
if (string.IsNullOrEmpty(str))
throw new Exception();
using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(str)))
{
return (T)DataContractJsonSerializer.ReadObject(memoryStream);
}
}

//二进制序列化
public static string BinarySerializeOperation(T obj)
{
string jsonString = "";
if (obj == null)
throw new Exception();
IFormatter formatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream())
{
formatter.Serialize(memoryStream, obj);
jsonString = Encoding.UTF8.GetString(memoryStream.ToArray());
}
return jsonString;
}

//二进制反序列化
public static T BinaryDeserializeOperation(string str)
{
if (string.IsNullOrEmpty(str))
throw new Exception();
IFormatter formatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(str)))
{
return (T)formatter.Deserialize(memoryStream);
}
}

/// <summary>
/// 把Json中的时间转化为正规时间,现在是Json数据格式,需要转化普通的时间格式 → yyyy-MM-dd HH:MM:ss
/// </summary>
/// <param name="jsonString">Json Time</param>
/// <returns></returns>
private static string ConvertJsonTimeToDateTime(string jsonString)
{
if (string.IsNullOrEmpty(jsonString))
throw new Exception();
const string matchDate = @"\\/Date\((\d+)\+\d+\)\\/";
Regex regex = new Regex(matchDate);
Match match = regex.Match(jsonString);
foreach (var matchValue in match.Groups)
{
if (matchValue is Match)
{
Match matchOne = (Match)matchValue;
DateTime dateTime = JsonOperation<DateTime>.JsonDeserializeOperation(string.Format("\"{0}\"", matchOne.Value));  // This is very important.
jsonString = jsonString.Replace(matchOne.Value, dateTime.ToString("yyyy-MM-dd HH-MM-ss"));
}
}
return jsonString;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: