你为什么会说是?-[影响力]

 今天早上把这本书读完了,短短的300页,绝对是今年读到的又一本经典之作,书摘什么的因为是读的纸质版,所以没有写什么笔记,但是还是简单的总结下书中的内容。顺带谈谈自己的感受。 就像昨天文章中提到的,这本书讲的不是成功学,而是心理学,讲我们在生活中为什么有时候会受到他人,或者是一些定律的影响,不知不觉中做了后来后悔的事情。或者是明明已经后悔了,却无法反悔。 影响力的几个武器; 第1种武器:互惠 互惠原理认为,我们应该尽量以相同的方式来回报他人为我们所作的一切。接受往往和偿还联系在一起,尽管互惠原理经常带给人们以负债感,但是总体而言,我们从中得利的时候还是占多数的,相比而言还是划算的。从而,相信并服从这个原理成为人们日常生活中一个十分重要的准则,而违背它则要付出严重的代价。人们普遍对那种只求索取不知偿还的人感到不信任,并尽量远离避免与之接触。往深里讲,互惠原理是人类社会形成的一大助力,是群体协作的默认基础。 在商业上最经典的案例则体现在商场里的“免费试用”中。很多人觉得,如果从那个笑容可掬的小姐手中接受了可以免费品尝的食物,就不好意思把杯子一还转身离开,总得买点什么吧,即时他们对那种商品并不是那么感兴趣。 第2种武器:承诺与一致 一旦我们做出了一个决定,或选择了一种立场,就会有发自内心以及来自外部的压力来迫使我们与此保持一致。在这种压力下,我们总是希望以实际行动来证明我们以前的决定是正确的。我们要让自己相信,自己作出了明智的抉择,而且毫无疑问地,自我感觉良好。 一个例子是安利公司就要求每个销售人员都要定下一个销售目标,而且不是光说说而已,必须得写下来。书面声明之所以特别有效,原因之一是它能使目标和方向都更明确,更重要的是,它能够轻易地公之于众。一旦个人公开选择某种立场之后,马上就会有一种维持这种立场的压力,因为他想在别人眼里显得前后一致。我承认我非常讨厌这家公司,有个笑话是这样的,十年后,我们不经意间再次相遇,她低声问我:“这些年过得好吗?她对你好吧。”我很伤感,说:“我还没结婚,一直等你。”她眼圈红了红,说:“你晚上7点来宾馆找我吧。”七夕夜,月如钩,我手捧鲜花,提前半小时来到宾馆,她迎我进去,招呼我坐下,幽幽问道:“你听说过安利吗?” 要想戒烟或者减肥成功,这种方法是非常有效的。给自己在乎的人说自己一定要减肥成功,并且勇敢说出来,这种压力会迫使你减肥成功 第3种武器:社会认同 有点像是从众,但不完全是,社会认同原理指出,我们进行是非判断的标准之一就是看别人是怎么想的,尤其是当我们要决定什么是正确的行为的时候。如果我们看到别人在某种场合做某件事情,我们就会断定这样做是有道理的。一个很有趣的实验可以证实这一点,站在一条繁忙的人行道上,选定天空中的某一快空白,盯着看上1分钟,在这段时间里你的身边大概不会发生什么事情;第二天,你带上四五个朋友到同一地点一起往上看,不出1分钟,就会有大群路人停下来,把脖子伸得长长的,跟你们几个一起往天上看;即使是那些没有加入你们的行人,也无法阻抗那种至少往上瞄一眼的压力。 在形势模糊不清的时候,每个人都希望看一看别人正在做什么,从而致使一个极为重要的现象的出现――“多元无知”。这个可以很好的解释小悦悦事件,因为路人多了以后,前一个的人的行为影响了后一个人,大家都在看别人在做什么,并且人多了以后,每个人的责任感被分散,因此,施救的概率降下来了,我不是要辩护什么,而是反对喜欢扣标签的人,这件事并不能说明社会道德什么下降及其厉害,虽然有下降,这件事只是很典型的一个社会心理学实例罢了。 书中做出指出,如果你遇到了危难,很可能出现人很多,但没人施救。。 本书作者的建议是,当你遇到突发灾难时,直接从人群中挑出一个人来,注视着他,指着他,直接对他说:“你,蓝夹克的先生,我需要帮助,请叫一辆救护车来”,总之,在紧急状态中需要帮助时,最有效的策略是减少周围人对你的处境和他们和责任的不确定性,尽量把你所需要的帮助表达精确。不要让旁观者自己去下结论,因为社会认同原理和多元无知效应很可能使他们对你的处境作出错误的诊断,在人群中尤其如此。 这样说了以后,被指定的那个人有了一种责任感,进行施救,其他人会因为确定了状况加入救助的行列。 第4种武器: 喜好 一句话就是:人们总是比较愿意答应自己认识和喜爱的人提出的请求 ,产生喜好的来源主要有外表的吸引力,这个不多解释,美女得到的帮助在陌生的时候必其他人要多,相似性,指对和自己相似的人,比如外貌,衣着,爱好的相同都会产生;称赞,是指人们会奉承话通常来之不拒,并对奉承者产生好感,接触和合作,指一般经历了一起合作的人之间会产生明显的好感,一个有意思的例子是人们对和他们一起吃饭的人好感尤其强烈;关联,指人们会爱屋及乌,比如中国古代的近朱者赤,近墨者黑,表示的有点这个意思,人们会把你交往的人的品质关联到你自己身上,也会把你传递的消息关联上你的身上,如果你经常传递不好的消息,,你懂的。 要对付这么多赢取我们好感的手段,不是一件容易的事。一个有效的方法是,将注意力集中在效果而不是原因上。当我们在和那些老练的推销员打交道时,我们只需要注意一件事,我们是不是过于迅速地对这个人产生了过多的好感。一旦答案为“是”的时候,我们就该反击了。不过这个只针对于商业上的,在真实的社交中,我还是很相信一见钟情,相见恨晚的。嘻嘻。 第5种武器:权威 密歇根大学的心理学教授Mligram (1974)主持了一个实验,结果表明,具有独立思考能力的成年人也会为了服从权威的命令而做出一些完全丧失理智的事情。这可以解释那些利用各种假头衔,衣着(比如警服)来骗人的人。如何克服,两步,第一步,问自己对方是不是会真的专家,第二步问自己他是不是会为自己考虑,同时还要提防有些专家通过抛出一些自己的小缺点来增强”诚实“,表明自己的可信度。这里面有个说法是我以前在社会心理学里看到的,讲到一个演讲的成功与否很大程度上取决于权威的权威,和主题没什么太大关系,这可以解释为什么有时候听专家演讲觉得跟没听似的。。 第6种武器:短缺 短缺原理在现实生活中最常见的运用就是商家所策划的“限量版”商品。不管数量有限的信息是真的还是伪造的,商家的用意都是让顾客相信某种东西不可多得,从而立刻觉得它身价百倍。与数量有限技巧相对应得是“截止时间”策略,也就是对顾客获得推销从业者提供得商品的机会加上时间限制,所谓的“最后三天,清仓甩卖”即源于此。我家附近的最后三天已经for循环了N次了。。。 最后作者也认为世界还是很复杂的,有时候被影响影响也无伤大雅,因为事情太多,不可能完全兼顾,但是对于一些很重要的事情还是要注意避免这类影响。我在读的过程中,也就是书的前半段,讲到利用对比原理和喜好原理来审问犯人,一个好警察一个坏警察,来套取犯人的口供,这在法律上是许可的 ,可我却有些不好的感受,对犯人来说,他受到了心理学的影响,他以为那个警察真的关心他,他以为这个好警察真的好,可是事实上,这只是一种策略罢了,这是多么残忍的一件事啊,所以,昨天我想到了一个词,叫做反心理学,我也不知道具体想表达什么意思,可能当时想的就是避免受到这类心理学应用的影响,不被残忍对待吧。

2012-06-07 · 1 min · bystander

LR(1)项目集规范簇的构造

 首先我们知道LR(0)的项目的形式是[A→α·β ]这样的.而在LR(1)中的项目形式是[A→α·β ,a ],其中A→α·β 为LR(0)项目,称为心,a为终结符或#,称为向前搜索符。对归约项目[A→α·,a],仅当前输入符号是a时,才能用A→α进行归约。一会将会看到具体的例子。 课本上给出的规则是:我将要对照着规则来说明,这里要强调一下,",‘在这里是分隔符。不是终结符。他是一个标志, 以S′→·S,#属于初始项目集中,把’#‘号作为向前搜索符,表示活前缀为γ(若γ是有关S产生式的某一右部)要归约成S时,必须面临输入符为’#‘号才行。因此对初始项目S′→·S,# 求闭包后再用转换函数逐步求出整个文法的LR(1)项目集族。具体构造步骤如下: (1) 构造LR(1)项目集的闭包函数。 a) I 的任何项目都属于CLOSURE(I) b) 若有项目[A→α·Bβ,a ]属于CLOSURE(I),B→γ是文法中的产生式,β∈V*,b∈FIRST(βa), 则[B→·γ,b]也属于CLOSURE(I)中。 c) 重复b)直到CLOSURE(I)不再增大为止。 (2) 转换函数的构造 LR(1)转换函数的构造与LR(0)的相似,GO(I,X)=CLOSURE(J) 其中I是LR(1)的项目集,X是文法符号: J={任何形如[A→αX·β,a]的项目 | [A→α·Xβ,a]∈I} 例如下列文法G′为: (0) S′→S (1) S→aAd (2) S→bAc (3) S→aec (4) S→bed (5) A→e 构造他的LR(1)项目集规范簇。 以I0=CLOSURE(S′→·S,#)开始。运算。若有项目[A→α·Bβ,a ]属于CLOSURE(I),B→γ是文法中的产生式,β∈V*,b∈FIRST(βa), 则[B→·γ,b]也属于CLOSURE(I)中。此时,我们可以把S看成B,#看成a,然后需要求FIRST集合,此时没有β,a为#,所以FIRST(#)中只有一个b=#,而S有四个产生式。所有四个产生式加上#都是在I0中,最终求得的I0项目集为 { S′→·S,# S→·aAd,# S→·bAc,# S→·aec,# S→·bed,# } 然后使用GO函数来构造I1,从J={任何形如[A→αX·β,a]的项目 | [A→α·Xβ,a]∈I}我们可以知道I1的核(最初的产生式)就是这里的J,然后呢。X是I(也就是我们的I0)中的·后面的符号,也就是输入符。。可以看到在I0中,X可以为S,a,b,我们先以I1=GO(I0,S)=CLOSURE( S′→S·,# ),注意,·号已经前进了。因为J是I输入进一的项目,求I1,发现·后面没符号了,所以闭包就是他自己了。最终求得的I1的项目集为: {S′→S·,# } 我们上一步是用的I1=GO(I0,S)来求得,我们求I2的时候使用GO(I0,a)来求,此时X就是a了。然后我们吧I0中符合的项目中的·后移一位得到J然后对J求闭包,就是I2了。此处J=S→a·Ad,# 和S→a·ec,# I2=GO(I0,a)=CLOSURE(S→a·Ad,# S→a·ec,#),然后又回到了求闭包了。 对于S→a·ec,#,因为输入符下一位是一个终结符,也就是说没有B→γ这样的产生式,所以这个就不用继续向下求闭包了,闭包就是他自己嘛。然后关键是S→a·Ad,# 此处的A相当于规则中的B,d相当于规则中的β,A→e存在。为了确定这个心的向前搜索符,我们根据规则需要求b∈FIRST(βa),这里也就是求First(d#),显然结果为b=d,规则中指出[B→·γ,b]也属于CLOSURE(I),所以可以确定A→·e,d也在I2中。。 最终I2的项目集为 { S→a·Ad,# S→a·ec,# A→·e,d } 到这里,关键点就说完了。只需要继续求GO(I0,b),然后求GO(I1,X),GO(I2,X)等等。X的确定前面已经说了,就是I1,I2的·后面的符号。就行了。。当然像此处的I1,·后面已经没付好了,所以GO(I1,X)就不用求了。。 这种东西还是要自己手动练习的。所以我给出最终的全部项目集规范簇,大家按照这个步骤来做一做。看看结果对不对吧。 I0: S′→·S,# S→·aAd,# S→·bAc,# S→·aec,# S→·bed,# I1: S′→S·,# I2: S→a·Ad,# S→a·ec,# A→·e,d I3: S→b·Ac,# S→b·ed,# A→·e,c I4: S→aA·d,# I5: S→ae·c,# A→e·,d I6: S→bA·c,# I7: S→be·d,# A→e·,c I8: S→aAd·,# I9: S→aec·,# I10:S→bAc·,# I11:S→bed·,# 构造的过程很繁琐。有点暴力计算的意思。不过,真正算起来步骤还是比较少的。

2012-06-02 · 1 min · bystander

Think-Aloud 可用性测试介绍

中文是指出声思考:出声思考。可用性测试中常用也很有用的一个数据收集方法,来改善产品。要求被测试者把在测试过程中即时的把自己的想法大声说出来。比如,你说我不知道干什么,这个好像有点问题,等等。然后有人来记录。 SSD4给出的具体步骤翻译添加解释如下: Define the study’s framework, 定义该测试报告的框架。比如系统准备解决什么问题,适合什么类型的用户,希望评估首次使用还是其他什么,希望最终的目标是什么,比如希望90%的用户可以初次顺利使用。 Choose what to observe, 选择打算观察测试者的什么行为,比如用户如何打开,先干了什么 Prepare for the think-aloud usability test, 为测试做准备,比如模拟真实情景,写个流程。开个会,招募实验人员。 Introduce the participants to the observation procedure, 给实验人员介绍步骤。抚慰一下他们的情绪。告诉他们目的,并且希望他们think aloud。 Conduct the observation, 进行观察 Analyze the observation, 分析观察结果 。 Find possible redesigns, 找到可能需要进行重新设计的地方 Write a report. 写个总结报告出来。完成 这不也就这样嘛。

2012-05-29 · 1 min · bystander

UAR报告的简单说明

UAR报告由以下几个部分构成。就这个例子简单说一下。 Example UAR — Time Zone ListBox Is Not Good //标题 UAR Identifier //问题编号,从1开始,每个问题都这样的格式来说明,就构成了UAR报告 HE18—Problem //后面这个problem表示有问题,也可以是Good,表示这部分很好。没问题。 Succinct description: //简短的描述 Time Zone pull-down ListBox provides too much irrelevant information. Evidence for the aspect: //违反了哪条规则,共有十条规则。 Heuristic: Aesthetics and minimalist design **Interface aspect: ** The pull-down ListBox has 50 lines of information—in very small font. There are many competing items of information to visually search, the vast majority of which are irrelevant to any one user’s particular task of finding a single desired time zone [![](/images/ "uar")](http://seqcc.icarnegie.com/content/SSD/SSD4/3.1/normal/pg-creatng-evaltng-interfaces/pg-crt-eval-list-combo/pg-he-clean-beauty/Ex5.png)In addition, the information is structured as follows:The string "[GMT " begins each line (which means Greenwich Mean Time). If the time zone is behind GMT, then a "-" indicates this fact, which is followed by the number of hours and minutes the time zone is behind GMT. If the time zone is ahead of GMT, a "+" is used instead. Finally, some words follow the GMT offset, which are either city or country names, or the names of regions.  The presentation of this structured information violates the aesthetics and minimalist design heuristic because the structure is not preserved visually from item to item. For example, the words are not always lined up vertically; see the entries for: ...

2012-05-29 · 3 min · bystander

VS2010 编译安装boost库

实践是最好的办法。。学习C++,想试试线程,然后打算用boost库,结果boost库编译差点吓到我。。没看到比较完整的安装教程。。一直耽搁。今天动手。完成了。方法记录如下: 1.下载boost 从boost官网( http://www.boost.org )上下载最新的boost版本,现在最新是1.49版本,解压到自定义目录(我解压到了D:/program files,最终的目录结构是D:\Program Files\boost_1_49_0) 2.编译安装 在D:\Program Files\boost_1_49_0的目录下,有一个bootstrap.bat文件,直接双击运行。就会在同目录生成b2.exe;bjam.exe两个文件。 3.设定编译环境 修改user-config.jam (D:\Program Files\boost_1_49_0\tools\build\v2\user-config.jam) 的MSVC configuration MSVC configuration Configure msvc (default version, searched for in standard locations and PATH). using msvc ; 在上面这段的下面直接添加如下的文字。 using msvc : 10.0 : :/wd4819/D_CRT_SECURE_NO_DEPRECATE/D_SCL_SECURE_NO_DEPRECATE/D_SECURE_SCL=0 ; 保存关闭。 4.开始编译 点击开始->所有程序->“Microsoft Visual Studio 2010”,指向“Visual Studio tools(工具)”,然后单击“Visual Studio 2010 command prompt(命令提示)” 使用cd切换到D:\Program Files\boost_1_49_0目录。这个就不说了 然后输入如下的代码: b2 toolset=msvc-10.0 architecture=x86 instruction-set=i686 address-model=32 link=static variant=debug,release threading=multi runtime-link=shared --without-python --without-mpi --without-wave --without-graph --without-math --without-serialization stage 解释一下命令的意思: 1.toolset:表示编译器工具,我安装的是VS2010,所以是msvc-10(如果你是VS2005,可以使用msvc-8.0 VS2008是msvc-9.0) 2.architecture:表示架构,也就是你的CPU架构,x86,x64,因为我安装的是win7 32位,所以使用了x86的架构 3.instruction-set:表示指令集,依然是8086指令集 4.address-model:表示地址长度为32位 5.link:表示生成动态/静态链接库,动态链接库是shared,静态链接库是static,一般都会编译成静态库,因为给出程序的时候打包boost的库会非常庞大 6.variant:表示生成的Debug或者release版本,一般情况下会两种版本都会编译出来的 7.threading:表示单/多线程编译,一般我们的程序都会用到多线程,所以选择了multi 8.runtime-link:表示动态/静态链接C/C++运行时库(C/C++ Runtime),我们选择了动态链接 9.without/with:表示不需要编译/需要编译哪些库,一些自己不用的库可以无需编译 10.stage/install:stage表示只生成库文件(DLL和Lib),install还会生成包含头文件的include目录,推荐使用stage,因为boost_1_49\boost中就是boost库完整的头文件,所以无需再拷贝一份出来。编译出来的库会放在stage文件夹中 这样一份完整的boost库就生成了,剩下就是直接使用到项目中了。 其实编译的具体命令都是可以自己写的。如果你需要编译所有。只需要使用下面的这行代码 b2 –toolset=msvc-10.0 –build-type=complete 就可以了。 不出问题的话。就开始编译了。。登个半个多小时吧。就会完成了。 5.设置vs 打开vs,新建一个工程。然后工程属性。配置属性->C/C++ ,附加包含目录 填上 D:\Program Files\boost_1_49_0;%(AdditionalIncludeDirectories) 这个是最终的结果,你也可以手动添加 在左侧选择链接器->附加库目录,填上 D:\Program Files\boost_1_49_0\stage\lib;%(AdditionalLibraryDirectories) 就可以了。 6.测试 在你新建的工程里输入如下的代码。运行成功就说明可以了 #include <boost/thread/thread.hpp> #include <iostream> void hello() { std::cout << "Hello world, I'm a thread!" << std::endl; } int main(int argc, char* argv[]) { boost::thread thrd(&hello); thrd.join(); return 0; } 参考: http://www.cppfans.org/1317.html http://www.cnblogs.com/ComputerG/archive/2011/03/10/1979730.html http://www.cppblog.com/shaker/archive/2011/11/30/33583.html

2012-05-24 · 1 min · bystander

C++ 独立引用,为什么?

问题: I read in some good C++ tutorial that independent references do exist, and act like aliasing. 我读了一些好的C++文章,发现独立引用确实存在,并且很像别名。 But… I wonder what it is made for. 但是,,,我想知道他适用于什么情况。 Why should one want to use aliasing.Besides, some piece of code that is not clear to me: 为什么有人想使用别名呢,另外,下面这段代码我不太清楚。 int a; int &ref = a; // independent reference int b = 19; ref = b; cout << a << " " << ref << "\n"; ref--; cout << a << " " << ref << "\n"; First, ref is a ‘reference’ to a.I understand from second line of code that address for ref (hence the ampershead) is 首先,ref是一个对a的引用,从第二行代码那我认为ref的地址也就是a,(括号里面不清楚什么意思。貌似是作者写错了) a. Then, integer ref is assigned the value of b (19). First cout returns a and ref, both equal to 19. 然后呢,整数ref被b(19)被赋值,第一次输出a和ref,都是19, Why? Isn’t integer a the address for ref? Then, decrements ref, and last cout gives two times 18. a and ref where decremented. 为什么,难道整数a不是给ref的地址?然后ref自减,最后输出了2个18,a和ref都减少了。 ...

2012-05-23 · 2 min · bystander

c & c++中sizeof返回值不同?

问题: A character array is defined globally and a structure with same name is defined within a function. 一个字符数组被定义为全局变量,一个相同名字的结构体被定义在一个函数内部。 Why sizeof operator returns different values for c & c++ ? 为什么sizeof操作符对于C和C++返回了不同的值呢? char S[13]; void fun() { struct S { int v; }; int v1 = sizeof(S); } // returns 4 in C++ and 13 in C 答案: Because in C++, the struct you defined is named S, while in C, 因为在C++中,你定义的结构体的名称是S,而在C中, it’s named struct S (which is why you often see typedef struct used in C code). 他叫做struct S(这也是为什么我们可以经常看到typedef struct 被用在C代码中)。 In C, to refer to the struct type, you need to say struct S. Therefore, sizeof(S) refers to the array. 在C中,引用一个结构类型的时候,你必须说struct S,因此,sizeof(S)调用的是数组S。 In C++, struct is unnecessary. So the local S hides the global S. 在C++中,struct这个字不是必需的,所以局部变量S隐藏了全局变量S。 If you were to change the code to the following, you would get the expected results: 如果你把代码改成下面的样子,你就能得到你期望的结果了。 ...

2012-05-22 · 1 min · bystander

快速排序算法

#include using namespace std; //化分区间,找到最后元素的排序位置。并返回分隔的点(即最后一数据排序的位置)。 //划分的区间是[nBegin, nEnd). pData是保存数据的指针 int Partition(int* pData, int nBeging, int nEnd) { int i = nBeging - 1; //分隔符号,最后nD保存在这里 --nEnd; int nD = pData[nEnd]; //比较的数据。 int nTemp; // 交换用的临时数据 //遍历数据比较,找到nD的位置,这里注意,比较结果是, //i的左边是小于等于nD的,i的右边是大于nD的 for (int j = nBeging; j < nEnd; ++j) { if (pData[j] <= nD) //如果数据比要比较的小,则在该数据的左边,与i+1交换 { ++i; //小于nD的数据多一个,所以要加1,i的左边数据都比nD小 nTemp = pData[i]; //交换数据 pData[i] = pData[j]; pData[j] = nTemp; } } //最后不要忘了吧nD和i+1交换,因为这里就是nD的位置咯。 ++i; pData[nEnd] = pData[i]; pData[i] = nD; return i; //返回nD的位置,就是分割的位置。 } //排序的递归调用。 int QuickSortRecursion(int* pData, int nBeging, int nEnd) { if (nBeging >= nEnd -1) //如果区域不存在或只有一个数据则不递归排序 { return 1; } //这里因为分割的时候,分割点处的数据就是排序中他的位置。 //也就是说他的左边的数据都小于等于他,他右边的数据都大于他。 //所以他不在递归调用的数据中。 int i = Partition(pData, nBeging, nEnd); //找到分割点 QuickSortRecursion(pData, nBeging, i); //递归左边的排序 QuickSortRecursion(pData, i + 1, nEnd); //递归右边的排序 return 1; } //快速排序 int QuickSort(int* pData, int nLen) { //递归调用,快速排序。 QuickSortRecursion(pData, 0, nLen); return 1; } int main() { int nData[10] = {5,9,3,2,1,6,20,45,88,75}; //测试数据 QuickSort(nData, 10); //调用快速排序 for (int i = 0; i < 10; ++i) //输出结果 { cout<

2012-05-19 · 1 min · bystander

对象数组的Xml序列化和反序列化

使用Serialization来进行序列化和反序列化,因此需要引入System.Xml.Serialization;命名空间。 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化。 本文的原始例子在参考文中,但是参考文中没有给出反序列化的例子,且xml文件不清晰。于是修改了代码,同时实现对象数组序列化和反序列化。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization; using System.IO; namespace UseXmlSerialization { class Program { static void Main(string[] args) { //声明一个猫对象 var cWhite = new Cat { Color = "White", Speed = 10, Saying = "I am a good WHITE cat" }; var cBlack = new Cat { Color = "Black", Speed = 10, Saying = "I am a good BLACK cat" }; CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite, cBlack } }; //序列化这个对象 XmlSerializer serializer = new XmlSerializer(typeof(CatCollection)); StringWriter sw = new StringWriter(); serializer.Serialize(sw, cc); //序列化到StringWriter对象sw里 string strXml = sw.ToString(); Console.WriteLine("对象数组序列化后:"); Console.WriteLine(strXml); Console.WriteLine("xml反序列化后:"); StringReader sr = new StringReader(strXml); CatCollection c2 = serializer.Deserialize(sr) as CatCollection; for (int i = 0; i < 2; i++) //验证xml文件是否已经被反序列化为对象数组 { Console.WriteLine("I am Cat " + i); Console.WriteLine(c2.Cats[i].Color); Console.WriteLine(c2.Cats[i].Saying); Console.WriteLine(); } } } //以下为类定义 [XmlRoot("Cats")] public class CatCollection { [XmlElement("Cat")] public Cat[] Cats { get; set; } } public class Cat { //定义Color属性的序列化为cat节点的属性 [XmlAttribute("color")] public string Color { get; set; } //要求不序列化Speed属性 [XmlIgnore] public int Speed { get; set; } //设置Saying属性序列化为Xml子元素 [XmlElement("saying")] public string Saying { get; set; } } } 参考: http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html

2012-05-18 · 1 min · bystander

修改Windows系统软件默认安装路径

 作为一个完全不能容忍windows默认程序都往C:\Program Files\目录里安装的人。每次安装软件的时候,都得手动一个个改到D:\Program Files里。安装软件多了。就hold不住了。 其实可以通过注册表使得所有安装程序默认安装到其他盘的。将下列内容保存到一个文本文件里,命名为Mo.reg。然后运行即可。以后安装的程序就会默认安装到D盘的Program Files目录了。你也可以根据需要自行修改 Windows Registry Editor Version 5.00 ;修改Windows系统软件默认安装路径 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion] “ProgramFilesDir”=“D:\Program Files” 效果如下图,安装程序已经默认到D盘了 update:已知后遗症,我在这样实践了以后,发现vs2010的.net framework 4将会丢失。也就是说就不能新建.net framework 4项目了,具体不明,可能是我当初把VS一部分安装到D盘的缘故,应该可以通过重新安装vs解决,如果你不想折腾。把注册表改回去就可以了。

2012-05-17 · 1 min · bystander