JSON.NET序列化继承对象

之前使用JSON.NET简单序列化了对象…

现在来读序列化文件…

static void Main(string[] args)
{
    List<BaseTest> baselist = new List<BaseTest>();

    childTest ct = new childTest();
    ct.n = 0;
    ct.f = 1.234f;
    baselist.Add(ct);

    OtherTest ot = new OtherTest();
    ot.n = 0;
    ot.strList.Add("ot1");
    ot.strList.Add("ot2");
    baselist.Add(ot);

    try
    {
        string str = Newtonsoft.Json.JsonConvert.SerializeObject(baselist);
        Console.WriteLine(str);
        List<BaseTest> p = (List<BaseTest>)Newtonsoft.Json.JsonConvert.DeserializeObject<List<BaseTest>>(str);
    }
    catch (Exception e)
    {
        System.Diagnostics.Debug.Assert(false);
    }
    Console.ReadKey();
}

结果发现,读取道德序列化,全是基类的信息…

JSON.NET简单序列化

Newtonsoft.Json,一款.NET中开源的Json序列化和反序列化类库

class BaseTest
{
    public int n;

    public BaseTest()
    {
        n = 0;
    }
}

static void Main(string[] args)
{
    BaseTest bt = new BaseTest();
    bt.n = 1;
    Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(bt));

    Console.ReadKey();
}

输出

{"n":1}

当类有继承关系的时候…

class BaseTest
{
    public int n;

    public BaseTest()
    {
        n = 0;
    }
}

class childTest : BaseTest
{
    public float f;

    public childTest()
        : base()
    {
        f = 1.23f;
    }
}

class OtherTest : BaseTest
{
    public List<string> strList;

    public OtherTest()
        : base()
    {
        strList = new List<string>();
    }
}

static void Main(string[] args)
{
    List<BaseTest> baselist = new List<BaseTest>();

    childTest ct = new childTest();
    ct.n = 0;
    ct.f = 1.234f;
    baselist.Add(ct);

    OtherTest ot = new OtherTest();
    ot.n = 0;
    ot.strList.Add("ot1");
    ot.strList.Add("ot2");
    baselist.Add(ot);

    try
    {
        Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(baselist));      
    }
    catch (Exception e)
    {
        System.Diagnostics.Debug.Assert(false);
    }
    Console.ReadKey();
}

输出

VC 控制台颜色设置

通常控制台都是白字黑底的,千篇一律不免单调。适当的在控制台中加入一些彩色可以让人耳目一新,本文介绍如何使用系统API接口去修改控制台的文字和背景颜色。

C++ 社会繁衍

把 C++ 想象成人类社会。

访问权限、继承、友元将无比真实的反应人类社会中的种种关系。

类内部访问权限

+---------+
|class    | --&gt; 人
+---------+
|public   | --&gt; 你能干啥
|protected| --&gt; 你留下啥
|private  | --&gt; 你藏了啥
+---------+
|friend   | --&gt; 你的圈子
+---------+

几乎所有人都知道你能干啥,这某种程度上是你在这个社会的价值体现。但这些不相干的人,并不知道你留下了啥,是万贯家财?还是诗书传承?谁知道?你的家人知道(类内部),你的后代知道(子类),你的朋友知道(友元)。至于你藏了些啥,除了你的家人(类内部),可能也只有几位密友(友元)了解。

回车与换行

今天,我总算搞清楚"回车"(carriage return)和"换行"(line feed)这两个概念的来历和区别了。

一个让人感伤又温馨的计算机故事

我是一个硬盘

我是一个硬盘,ST380021A,在一个普普通通的台式机里工作。别人总认为我们是高科技白领,工作又干净又体面,似乎风光得很,也 许他们是因为看到洁白漂亮的机箱才有这样的错觉吧。其实象我们这样的小台式机,工作环境狭迫,里面的灰尘吓得死人。每天生活死水一潭,工作机械重复。跑跑 文字处理看看电影还凑合,真要遇到什么大软件和游戏,上上下下就要忙的团团转,最后还常常要死机。我们这一行技术变化快,差不多每过两三年就要升级换代, 所以人人都很有压力,而且没有安全感。

C++ 不要按值传递数组

有个国外团队检测了 200 多个 C/C++ 开源项目,包括了 Php、Qt 和 Linux 内核等知名项目。于是他们每天分享一个错误案例,并给出相应建议。本篇案例来自 Wolf 源代码。

C++ 生成UUID

C++创建UUID的两种方法:

std::string newGUID()
{
	char buf[50];
	memset(buf, 0, sizeof(buf));
	GUID guid;
	if (S_OK == ::CoCreateGuid(&guid)) {
		sprintf_s(buf, 50, "{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}"
			, guid.Data1
			, guid.Data2
			, guid.Data3
			, guid.Data4[0], guid.Data4[1]
			, guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5]
			, guid.Data4[6], guid.Data4[7]);
	}
	return std::string(buf);
}

使用BOOST的话:

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>  
#include <boost/lexical_cast.hpp>

std::string getUUID()
{
	boost::uuids::random_generator rgen;						//随机生成器  
	boost::uuids::uuid a_uuid = rgen();							//生成一个随机的UUID  
	std::string str = boost::lexical_cast<std::string>(a_uuid); //uuid转换到字符串
	return str;
}

C++11多线程学习3 : join和detach

在上一篇文章C++11多线程学习1中的代码,我们使用了join。但是其实使用detach也是一样的结果。

int _tmain(int argc, _TCHAR* argv[])
{
	std::thread t1(test, "t1", 1000);
	std::thread t2(test, "t2", 1500);
	t1.join(); // detach()
	t2.join(); // detach()

	char ch;
	std::cin >> ch;
	return 0;
}

无论是join和detach其结果都是: 结果2

但是如果换成这份代码,结果就不同了。

C++11多线程学习2 : 类

C++11多线程学习1中,使用的函数是全局函数。

如果换成类函数又怎么样呢?

看下面的例子:

#include <iostream>
#include <windows.h>
#include <thread>

class test
{
public:
	test() {}
	~test() {}

public:
	void testcout(const std::string& str, int time)
	{
		for (int i = 0; i < 10; i++)
		{
			Sleep(time);
			std::cout << str.c_str() << i << std::endl;
		}
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	test te;
	std::thread t1(&test::testcout, te, "t1", 1000);
	std::thread t2(&test::testcout, te, "t2", 1300);
	t1.join();
	t2.join();

	char ch;
	std::cin >> ch;
	return 0;
}

运行结果依旧如下: 结果1