前言

前段时间使用了net.json保存对象数据。添加完成后,测试发现300多实例数据保存加载json文件,速度比原方式(BinaryFormatter)慢。但是功能加上后也懒再删掉代码了,索性就采用两种方式。怎么说两种方式也比一种多不是?_

net.json详细介绍

1 测试之前需要引用Newtonsoft.Json.dll,可在官网下载最新安装包。本文写作时最新Version 10.0.3

测试类Student

  1. [JsonObject(MemberSerialization.Fields)]
  2. class Student
  3. {
  4. const int count = 1024;
  5. public Student(int ID, string Name, int Age, string Sex)
  6. {
  7. this.ID = ID;
  8. this.Name = Name;
  9. this.Age = Age;
  10. this.Sex = Sex;
  11. buffer = new byte[count];
  12. for (int i = 0; i < count; i++)
  13. {
  14. buffer[i] = (byte)i;
  15. }
  16. }
  17. byte[] buffer;
  18. int ID { get; set; }
  19. string Name { get; set; }
  20. int Age { get; set; }
  21. string Sex { get; set; }
  22. [JsonIgnore]
  23. IntPtr hwnd;
  24. [OnDeserialized]
  25. private void SetValuesOnDeserialized(StreamingContext context)
  26. {
  27. string stringA = "I seem to be turned around!";
  28. hwnd = System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(stringA);
  29. }
  30. }

2 序列化对象默认情况下只有公共成员,此类没有公共成员。故设置特性[JsonObject(MemberSerialization.Fields)]可序列化所有成员。详细可见MemberSerialization

3 对于Intprt hwnd,标记为[JsonIgnore]表示不进行序列化;当进行反序列化后使用[OnDeserialized]可根据需要重新对其进行赋值 OnDeserializedAttribute 类,对于自定义序列化可参考msdn自定义序列化

测试用例

  1. ArrayList StuModel = new ArrayList()
  2. {
  3. new Student(1,"王小二",18,"男"),
  4. new Student(2,"丽丽",16,"女")
  5. };
  6. using (StreamWriter file = File.CreateText(@"test.json"))
  7. {
  8. JsonSerializer serializer = new JsonSerializer();
  9. serializer.Serialize(file, StuModel);
  10. }
  11. using (StreamReader file = File.OpenText(@"test.json"))
  12. {
  13. JsonSerializer serializer = new JsonSerializer();
  14. var movie2 = (ArrayList)serializer.Deserialize(file, typeof(ArrayList));
  15. for (int i = 0; i < movie2.Count; i++)
  16. {
  17. movie2[i] = JsonConvert.DeserializeObject<Student>(movie2[i].ToString());
  18. }
  19. }

4 测试代码中集合用ArrayList,故反序列化后需要再次进行转换,把集合里面的每个JObject转换成Student,如果使用List就不需要,如下:

  1. List<Student> StuModel = new List<Student>()
  2. {
  3. new Student(1,"王小二",18,"男"),
  4. new Student(2,"丽丽",16,"女")
  5. };
  6. using (StreamWriter file = File.CreateText(@"test.json"))
  7. {
  8. JsonSerializer serializer = new JsonSerializer();
  9. serializer.Serialize(file, StuModel);
  10. }
  11. using (StreamReader file = File.OpenText(@"test.json"))
  12. {
  13. JsonSerializer serializer = new JsonSerializer();
  14. var movie2 = (List<Student>)serializer.Deserialize(file, typeof(List<Student>));
  15. }

c# 类实例序列化反序列化json文件 (原发布 csdn 2017-10-01 20:02:12)的更多相关文章

  1. c# Equal函数 and 运算符'==' (原发布 csdn 2017年10月15日 20:39:26)

    1.==.!=.<.>.<= 和>= 运算符为比较运算符(comparison operator).C#语言规范5.0中文版中比较运算符的描述如下: 2.通用类型系统 3.值类 ...

  2. IEEE浮点表示 (原发布 csdn 2018-10-14 10:29:33)

    目录 观察IEEE浮点表示 工作中遇到过整型转浮点型(union那种转换),碰到就看下书,过后就遗忘了.等过段时间又出现此现象,又重新拿起书本,这次记录了过程.然而一直等到今天才写出来,以防以后还用到 ...

  3. 关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

    前言 昨天晚上闲着无事,就上csdn逛了一下,突然发现一个帖子很有意思,就点进去看了一下. 问题很精辟 int a = 1; object b=a; object c = b; c = 2; 为什么b ...

  4. java使用类序列化反序列化(读写文件)

    创建类:Role package com.wbg.springRedis.entity; import java.io.Serializable; public class Role implemen ...

  5. c#如何序列化与反序列化json文件

    见网站: http://www.json.org/ 代码如下: /* * Copyright (c) 2013 Calvin Rien * * Based on the JSON parser by ...

  6. wpf 单例模式和异常处理 (原发布 csdn 2017-04-12 20:34:12)

    第一次写博客,如有错误,请大家及时告知,本人立即改之. 如果您有好的想法或者建议,我随时与我联系. 如果发现代码有误导时,请与我联系,我立即改之. 好了不多说,直接贴代码. 一般的错误,使用下面三个就 ...

  7. WPF DispatcherTimer一些个人看法 (原发布 csdn 2017-04-25 19:12:22)

    wpf中的DispatcherTimer基本用法,本文不在叙述.主要写一些不同的,来提醒自己不要再犯同样错误. 前几天写代码时发现.当在非UI线程创建DispatcherTimer实例时,程序无法进入 ...

  8. WPF DataGrid显示MySQL查询信息,且可删除、修改、插入 (原发布 csdn 2018-10-13 20:07:28)

    1.入行好几年了,工作中使用数据库几率很小(传统行业).借着十一假期回家机会,学习下数据库. 2.初次了解数据库相关知识,如果本文有误,还望告知. 3.本文主要目的,记录下wpf界面显示数据库信息,且 ...

  9. WPF 启动页面 (原发布 csdn 2017-06-26 19:26:01)

    如果我写的有误,请及时与我联系,我立即改之以免继续误导他/她人. 如果您有好的想法或者建议,请随时与我联系. wpf软件启动时,加载启动页面.软件初始化完成之后关闭页面. App.xaml.cs代码 ...

随机推荐

  1. vue学习指南:第五篇(详细) - vue的 computed、methods、watch 的区别?

    Computed 计算属性 1. 将函数代码块中返回的结果 赋值 给前面的方法名 2. computed 中的属性有缓存功能,只要data中的数据不发生改变,计算得到的新属       性就会被缓存下 ...

  2. 汇编之JCC指令

    版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明.2019-09-06,21:59:16.作者By-----溺心与沉浮----博客园 JCC指令决定它跳不跳转跟别的没关系,只跟EFLAG标 ...

  3. element-ui的tag组件关闭事件失效的原因

    问题如上,原因是忘了加上一个函数 @close="handleClose(tag)" <el-tag :key="tag" v-for="tag ...

  4. Codeforces Round #304 (Div. 2)(CF546D) Soldier and Number Game(线性筛)

    题意 给你a,b(1<=b<=a<=5000000)表示a!/b!表示的数,你每次可以对这个数除以x(x>1且x为这个数的因子)使他变成a!/b!/x, 问你最多可以操作多少次 ...

  5. C# 在不同编译下的不同表现

    这是我在2018年的时候发在Unity Forums上的帖子, 至今无人回复, 之前是想用TypedReference做DataTable的相关功能的, 可是结果不正确. tiancaiwrk, Oc ...

  6. 习题6-2 使用函数求特殊a串数列和

    #include <stdio.h> int fn(int a, int n); int SumA(int a, int n); int main() { int a, n; scanf_ ...

  7. openssl+vsftpd 加密验证方式

    [root@localhost ~]# rpm -q opensslopenssl-1.0.1e-48.el6.x86_64[root@localhost ~]# ldd /usr/sbin/vsft ...

  8. MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  9. 重新学习SpringMVC——高级

    30. SpringMVC_RESTRUL_CRUD_显示所有员工信息31. SpringMVC_RESTRUL_CRUD_添加操作&表单标签32. SpringMVC_RESTRUL_CRU ...

  10. [POJ2336]Ferry Loading II

    题目描述 Description Before bridges were common, ferries were used to transport cars across rivers. Rive ...