精华内容
下载资源
问答
  • 脆弱 读书笔记

    千次阅读 2015-08-16 15:19:01
    整体上来说,先是从各种现象证明了所谓脆弱性能够带来的好处,以及为什么会有这种现象。接下来就是反思了我们目前提倡的所谓知识模式是否正确,一味的强调可叙述性和共性,而忽视各种特殊性,会给整个知识体系带来...

    整体上来说,先是从各种现象证明了所谓反脆弱性能够带来的好处,以及为什么会有这种现象。接下来就是反思了我们目前提倡的所谓知识模式是否正确,一味的强调可叙述性和共性,而忽视各种特殊性,会给整个知识体系带来致命的打击。最后,就是提醒我们,既然我们无法预知黑天鹅事件的出现,还不如把精力从如何预测转移到如何防范。说实在点就是,如果我们只是看到了10级地震的出现概率是百年一遇,但如果明天就是百年最后一天,并发生了10级地震,我们要做的是把防范工作做到超出10级的地步,甚至利用这个百年一遇,而不是简单地说,百年一遇啊,概率太低了,不考虑了。

    等风来的黑天鹅——如何在不可预测性下做决策

    《反脆弱》是一本很容易引起误读的书。《黑天鹅》、《随机致富的傻瓜》更正了大部分人的决定论的或者机械论的旧世界观,但实际上,二战前后,几乎没有一个西方学科不是采取概率论和统计学的世界观了,换言之,西方在二战后,有一个世界观和方法论的革命,只是由于特殊的原因,中国没有跟进而已。很多人不知道波普尔、不知道哈耶克,也没有读过他们的著作。中国跟进的是所谓复杂科学,即系统论、控制论、信息论,研究不确定性,是这几年才开始的事。其实塔勒布在这本《反脆弱》里,我认为,却有着超越哈耶克与波普尔的洞见。

    反决定论,通俗的说,就是事物的不可预测性。复杂性研究的是事物的整体性,或者说,涌现性,它的本质是复杂因果现象,还是在可预测的范围内。概率论和统计学,研究的是不确定性,也就是一个原因有着多种结果的问题,还处于因果论的范畴。《反脆弱》实际上对不确定性进行了深度的掘进。在不确定性里存在着一种不可预测但一旦发生却作用很大的小概率事件,塔勒布把它叫做“黑天鹅事件”。比如,次贷危机、福岛核泄漏。“黑天鹅事件”是无法预测的,因此,它不是我们的预测模型须要修订的问题,而是我们须要更换我们的风险治理理念和方法的问题。我认为这是《反脆弱》的核心内容。

    而塔勒布的“黑天鹅事件”解决方案,简言之,就是——建立“反脆弱性”。塔勒布认为,事物的不确定性的根源,是事物本身具有的不对称结构,这很容易让人联想到经济学里的“弹性”概念,也就是X的单位变化,引起Y的不同程度的变化,也就是数学中的非线性函数关系。实际上塔勒布讨论的不是这种仍处在可预测范围的现象。他认为“黑天鹅事件”是完全不可预测的,更不可能找出他们的函数关系。我们唯一明智的选择就是,通过建立“反脆弱性”来从中获益,而不是受损。可以说,整本《反脆弱》就是围绕着“什么是反脆弱性”、“缺乏反脆弱性是如何使我们的政治、经济、社会、个人受损的”、“如何建立反脆弱性”而展开的,并且塔勒布坚定地认为,反脆弱性是所有幸存下来的自然和复杂系统的共同特征。

    按塔勒布的说法,“反脆弱性”是很难定义的,他使用的是否定定义法,也就是说,脆弱的反义词不是强韧,而是“反脆弱”。正因为这个概念很难定义,超乎人们的常识视野,所以塔勒布才会不厌其烦地不惜用一本书来诠释这个崭新的概念,书中的例子小到健身、大到国家治理,所有的事理可以说都从正反两方面去努力界定它。这就像没有发现基因之前,人们很难认识到基因的存在。哈耶克在经济社会学里有个著名的观点——“自组织”,并认为市场之所以是组织社会经济生活的最优方式,就是因为“自组织”。但“自组织”的观点其实是消极的,是被动适应,而塔勒布的“反脆弱”,是主动适应,积极探索。正是在这一点上,我认为塔勒布超越了哈耶克。波普尔认为科学的本质就是“可证伪”,而科学的方法其实是“试错法”,塔勒布几乎读过波普尔的所有书,但塔勒布认为,仅仅试错是不够的,更重要的问题是,我们如何从试错中受益。为此,他提出了自己的观点,在事物存在不可预测性的情况下,我们可以采取“凸性战略”和“哑铃策略”。我认为他在这里,超越了波普尔,提出了如何在不可预测性下做决策的积极方略。显然,这又是两个崭新的概念。

    当你真的从书中学会了如何驯服“黑天鹅”,你将不再担惊受怕,你所要做的,也许就真的只需要,等风来了。

    读书笔记整理:

    0p 脆弱的事物喜欢安宁的环境,反脆弱的事物则从混乱中成长,强韧的事物不太在意环境。

    0p 反脆弱性:从冲击中受益,暴露在波动性、随机性、混乱和压力、风险和不确定性下时,反而能茁壮成长和壮大,从随机事件中获得有利结果。

    0p 风会熄灭蜡烛,却能使火越烧越旺。对随机性、不确定性和混沌也是一样:你要利用它们,而不是躲避它们。你要成为火,渴望得到风的吹拂。

    0p 只有经过提炼的想法、那些经过长久的时间积淀仍留在我们脑中的想法才是可以接受的,它们也大多来自于现实的想法。

    0p 概要导图: 1. 脆弱性-强韧性-反脆弱性就好比达摩克利斯-凤凰-九头蛇怪; 2. 除经济学领域之外,对某事的痴迷是最具反脆弱性的; 3. 机械体-有机体; 4. 整体的反脆弱性取决于各部分的脆弱性,因此死亡对生命来说是必要的,渴望永生是愚蠢的,而错误会使集体受益; 5. 普洛克拉斯提斯之床:市政噪声对社会起到稳定的效用; 6. 预测是现代化产物; 7. 生活中的杠铃策略有助于任何事物从脆弱性转变为反脆弱; 8. 偏爱秩序的教育与偏爱无序的创新之间的矛盾; 9. 理性的漫游者,酒神式思维; 10. 规模会带来脆弱性; 11. 非理性认知比理性认知更具优势; 12. 代理问题是脆弱性的转移; 13. 群体会犯错误,而个人可能知道真相; 14.一切都会从波动性中获得受益或遭受损失。脆弱性就是波动性和不确定性带来的损失; 15. 阿多尼斯为什么会每年死去再复活?

    0p 必须努力理顺你的思维,才能使其简单明了。没有清晰的理解,就写不出清晰的文章。

    0p 道德困境:为了得到整体的反脆弱性,必须要让个体脆弱起来。

    4p 我们生活中一半的事物—非常有趣的一半事物—都还没有被妥善命名。

    14p 过度隐藏机制往往隐藏在最不可能的地方。长途飞行后最好去健身房锻炼以消除疲劳,而不是坐下来休息。

    14p 精神集中可以帮助我们进入更高的精神层面,激活更具活力、更善于分析的大脑机器。

    15p 反脆弱性的毒物兴奋效应其实是某种形式的冗余,或者称为过度反应。这一种投资,而不仅仅是保险。

    20p 信息是具有反脆弱性的,湮灭信息的努力比宣传信息的努力更能增强信息的力量。所以千万不要为自己辩解太多,否则只会越描越黑。信息非常无情,它有能力控制那些试图控制它的人。

    21p 批评和诋毁本身就是对压制的反脆弱性的反应,错误的乐观者乐意看到被批评者的反击,以验证一些想法。智慧的人也善于挑衅别人,激发别人对自己的嫉妒,并从反应中受益。

    21p 一部作品遭到了批评,实际上说明它引起了真实的、好不虚假的关注,表明它不是无聊的—无聊是作品最致命的缺陷。聪明的作者只会让记者写关于他们的负面评论,因为这会让观众对她们更有兴趣。

    22p 声誉受损的影响力在互联网时代是不可控制的,你不可能杜绝别人的批评,如果你的工作和职业很容易受声誉的影响,那么这些工作就不值得做。

    23p 给我们带来最大利益的并不是那些试图帮助我们(比如提供“建议”)的人,而是那些曾努力伤害我们但最终未能如愿的人。

    25p 衰老是功能失调和老化的结合,老化无法也不应避免,但功能失调是可以避免的。在自然的环境下,人们会死,但是不会衰老,或者衰老的时间很短。

    28p 反脆弱的产生是有条件的,压力源的刺激频率和程度非常重要:急性而适度、并给予较长恢复期的刺激会更有效。这将使得这些压力源成为信息的传导渠道。

    30p 耗散结构:有机体和动态系统的正常状态离不开一定的波动性、随机性、信息的连续交换,以及压力。一旦剥夺这些,就会给它们带来伤害。

    33p 写作的价值就在于它能给予我们一种冒险的刺激感。

    37p 大自然和个体生物之间存在着一定的紧张关系。

    42p 每一次飞机失事都降低了下一次事故的发生概率,每一家银行崩溃却会提高下一家银行崩溃的概率。

    43p 系统的反脆弱性是通过牺牲个体为代价取得的,于是,我们一定要确保自己的错误足够的小,以便能够生存下来。

    49p “你们中的大多数人将遭受失败、轻谩和贫困,但比我们非常感谢你们为了全球经济增长与他人脱贫而承担的风险和做出的牺牲。你们正是国家反脆弱性的来源。美国感谢你。”

    52p 简化导致最严重的问题往往出现在线性来简化和代替非线性的情况。自以为消除随机性,就可以消除风险。这才是最罪恶的普洛克拉斯提斯之床,也是一切问题的根源。而实际上,压力就是信息,由于有持续的压力才可以获得不断调整的机会,还能有机会获得一些意外的礼物和惊喜,以及自由选择的权力。

    59p 官僚机构的建立使得公务员都在抽象的理论基础上作决定,同时却误认为他们是在以合理的、负责任的方式行事。

    59p 我们的情绪能量让我们无视事件发生的概率,而媒体让事情变得更糟,因为媒体会利用我们对逸闻趣事的痴迷、对耸人听闻事件的渴求来影响我们,并因此造成很大的不公平。

    60p 瑞士的高等教育水平比其他富裕国家要低,它的行业系统也都是基于学徒模式,更接近职业培训而不是理论学习,是基于工艺和技术诀窍而非书本上的知识。

    62p 一只火鸡在使用过去的“证据”进行“严格”的未来预测,而无视感恩节的来临。从而产生了“意外死亡”的黑天鹅事件,可是对于养育它的屠夫来说,它的命运早就被安排好了。

    65p 卢梭:微小的骚动和焦虑滋养了灵魂,让物种繁荣的不是和平,而是自由。没有波动,就没有稳定。

    68p 风险存在于未来,而不是过去。

    85p 现象学是强韧的、可用的,而理论往往言过其实,在理论之外决策时非常不可靠。因此,盲目使用理论、甚至拥有理论是一件非常危险的事情。

    86p 旨在消除经济周期的努力,是所有脆弱性的根源。

    90p 拖延是我们的自然防御本能,是让事情顺其自然地发展、行驶其反脆弱性的本能;它源于某些生态或自然的智慧,结果也并不总是坏的。事实上人类是非常不擅长过滤信息的,特别是短期信息,而拖延则是帮助我们筛选信息的较好方式,它能避免我们由于冲动而轻信某个信息。

    98p 大政府刺激了经济增长,却没有逗留过长时间,未引起反作用。

    104p 黑天鹅领域中的随机性是无法追踪的,总是有知识所无法到达的极限。

    120p 财富会让我们担心不利因素,因此,依赖于它会让我们自己背上沉重的负担。更糟糕的是,依赖于具体情况(或者说具体情况带来的情绪),会让我们成为身外之物的奴隶。

    121p 斯多葛情绪强韧法:知性的生活关乎如何进行情绪定位,以消除伤害的刺激,是驯化而非消除。方法就是淡化你所拥有的东西在你心中的地位,这样任何损失都不会给你带来难以愈合的伤痛,世界的波动性也不能给你带来负面影响。将对情绪的关注转移到对产生情绪的核心根源的关注上,同时保持对情感的掌控力。从而能够将恐惧转化为谨慎、将痛苦转化为信息、将错误转化为启示、将欲望转化为事业。

    128p 反脆弱性是积极主动加上保守偏执的组合—消除不利因素,保护自己免受极端伤害,同时让有利因素或正面的“黑天鹅”顺其自然地发挥作用。要让有利因素大于不利因素,只需要减少极端不利因素的侵害(情绪伤害),而不是改善中间因素。

    129p 人们往往做最好的打算,而希望侥幸逃脱最坏的结果。反感小的损失,但对非常严重的“黑天鹅”风险(他们往往会低估)却毫无反应,因为他们往往会为小的可能的损失投保,但却忽略了大的罕见的损失。

    130p 先做非常安全的工作,随后从事投机性较强的工作。先是埋头行动,随后埋头思考。最可取的就是高强度地工作一段非常短的时间,然后什么都不做,直到完全恢复,并期待从来一次。绝不能从事低强度、无休止、少睡眠、多乏味工作。

    131p 要么是贵族,要么是冒险家。绝不要做中产阶级。社会政策往往保护弱势群体,同时让强者各尽其职,绝不会帮助中间阶层巩固其特权,因为这样会阻碍进化,造成各种经济政治问题,最终还会给穷人带来最大伤害。

    132p 我的写作方法如下:一方面,我写任何人都能读懂的散文,另一方面,我写技术性论文,不会写介于两者之间的文章,如记者访谈、报纸文章、署名评论等非出版社要求的文章。

    135p 观光客无不抱有目的论错觉,假定愿景的完整性和精确性,并将其锁入一个难以修订的计划,而理性漫游者却会持续、合理地根据他获得的信息修订他的目标。观光客还会误以为其他人知道自己要去哪里,知道自己想要什么。而理性漫游者的理念是,人们根本不知道他们想要什么,直到你提供给他们。

    139p 一个人如果明智地运用财务独立,可以让你更加坚韧,它会为你提供更多选择权,并让你做出正确的选择。自由就是终极选择权。选择权并不关心平均结果,而只关心有利因素(因为不利因素并不会超过有利界限)。

    144p 如果你有可选择性,那么你就不要太需要智力、知识、洞见、技巧,或者那些脑细胞中发生的复杂的事情。因为你不必每次都正确。你所需要的只是不做不明智的事情,以免伤害自己(比如忽略某些事情),随后就能在有利的结果发生后乐享受益了。(关键是你的评估并不需要预先执行,只要在结果发生后进行即可)

    146p 选择权 = 不对称性 + 理性。理性就是你知道要保留好的,抛弃坏的,知道如何获取利润。

    149p 不是教育带来了财富,而是财富带来了教育。明智的行为和发现只是明智的思想的结果。

    154p 试错法不是随机的,由于可选择性的存在,它需要一定的理性:它需要你以一定的智慧来识别有利的结果,以知道该放弃什么。你的理性就在于,同一个地方不必寻找两次。这样在找寻的过程中,每一次尝试、每一次失败都能提供额外的信息,每一个信息都比前一个信息更有价值,因为你越来越清楚,哪些方法是无用的,或者在哪些地方不可能找到钱包。在一个你确切地知道自己要找寻什么的环境中,每次尝试都会使你更接近于那个东西。我们从失败的尝试中能够逐渐摸索出正确的方向。

    163p 真实的世界依赖于反脆弱性的智慧,但是干预主义者从不接受事情没有他们的介入也可以改善的事实。

    165p 精明源于需要,成功则来自困难。

    173p 经济学家可以启发我们怎么做,却不可以指手划脚告诉我们该怎么做。

    176p 课堂教育并不会带来财富;而是有钱之后,人们才会接受教育(一种副现象)。

    180p 并不是把理论付诸实践,而是在实践中创造理论。理论其实是解决问题后的产物,但不能反过来说。

    188p 应该把赌注投给积极进取地骑师探索者,而不是马匹。因为创新是需要灵感的,需要具备漫游者般的能力,随时抓住突然出现的机遇,而不是墨守成规地行事。

    205p 在学校被灌输的事情,我已经忘光了;而我自己决定读的东西,我仍然记得很牢。追随自己的爱好来选择读物的重要意义,莫过于此。

    210p 问题不是为了答案才设计的,问题的答案永远是根植于问题之中的,千万不要回答一个对你来说毫无意义的问题。

    213p 从定义上说,逻辑排除了细节,而由于真相只存在于细节中,因此在寻找道德和政治科学中的真相时,逻辑只是无用的工具。

    216p 风险比知识更重要,决策的影响将超越逻辑。哲学家谈论真与假,但真正过日子的人谈论报酬、威胁和后果(风险与回报)。也就是脆弱性与反脆弱性。

    226p 脆弱性是非线性的,即对于脆弱物体而言,温和冲击的累计效应要低于等量的单一严重冲击所造成的单一影响。而对于反脆弱性物体来说,在一定限度内,冲击性越强,带来的益处越大(相应的,伤害也更小)。

    243p 全球化带来的脆弱性归咎于复杂性。

    261p 关注核心问题,其他方面并不起主导作用。要让自己有效地行动就必须忽略很多东西。

    263p 预言与知识一样,是减法,而非加法。

    274p 大部分创新是失败的,但这不妨碍人们去尝试。

    283p 尽量不要去读过去20年里出版的书,除了不是写过去50年内历史的历史书。

    287p 我们的世界中隐藏着秘密,只有实践可以发现它们,而意见和分析是完全无法全面捕捉它们的。但只有时间颠扑不破的东西,才是属于我们永远需要的东西。

    289p “你有证据吗”的谬论是将证明无害的证据与缺乏证据证明有害混为一谈。但在现实中,在非线性情况下,简单的“有害”或“有益”的陈述都会失灵,关键在于剂量。

    306p 相信一个人并不拥有完整的信息,而且所作所为也要这么认为—要更成熟,你必须接受并非无所不知的事实。

    310p 消除一些没有经过进化历练的事物,有助于降低黑天鹅这种极端事件的概率,同时使人类有机会得到改进。如果人们能够改进,我们可以相当确信,它将在很大程度上消除看不见的副作用。同样的,幸福最好用否定的概念来阐释。

    314p 在人性深处,我们知道什么时候需要寻求宗教的安慰,什么时候需要回到科学思维上来。

    326p 有的人只能被称为半个人,不是说他没有观点,而是说他不敢为之冒险。如果不承担风险,那么那些不承担的人带给你的侮辱只不过如同牲畜的吠叫:你不可能因为狗朝着你狂吠而感觉收到了侮辱。

    328p 有些人拥有了选择权或者可选择性,却是以牺牲他人的利益为代价,而后者还不自知。

    332p 过去是流动性的,充斥着选择偏见和不断修正的记忆。

    336p 不要询问任何人的意见、预测或建议。只要问他们的投资组合中有什么或者没有什么就行。

    337p 不承担风险就没有资格发表意见。现实世界中的决策,也就是放手去做,而不是用言辞去预测。愚蠢的人总是力图赢得辩论,而聪明的人则寻求获利。要知道在大自然中,意见和预测根本无关紧要;生存才是最重要的。

    343p 先知的预言是对信念的承诺,不是第一个产生想法的人,而是第一个相信这个想法的人,而且始终相信。只有真正相信的人,才能避免最终的自相矛盾,并且陷入事后预测的谬误。

    363p 数据只能真正提供以否定法界定的知识—它可以有效地用于揭穿,而非确认某种观点。

    368p 玻璃杯是死的东西,活的东西才喜欢波动性。

    不确定性中改变人生轨迹

    春节期间读完《黑天鹅》和《反脆弱》两本书,翻译比较生涩、措辞比较专业,所以读起来更需集中精神、逐字逐句地去理解和消化。两本书一脉相承但又各有侧重,黑天鹅侧重描述未知事件的客观存在以及影响,反脆弱性侧重讲述在不确定性中抓住获益的机会,论喜好,我个人更倾向于前者。

    黑天鹅效应:未来的不可预测性

    用三种理解来解释下黑天鹅效应。

    一、最根源故事:17世纪之前的欧洲人认为天鹅都是白色的,但随着在澳大利亚第一只黑天鹅的出现,这个不可动摇的信念崩溃了,这说明过度相信经验的盲目,而不知道一只黑天鹅的出现就足以颠覆一切。
    二、最专业解读:黑天鹅事件是指不可预测的重大事件,它在意料之外,却又改变一切,如书中描述的泰坦尼克号、金融风暴、9.11事件、日本地震、中国雪灾等等重大事件,足以说明它存在各个领域,无论金融市场、商业、经济还是个人生活,都逃不过它的控制。
    三、最生活现象:火鸡在被主人饲养的时候,一直好吃好喝,以为主人对它很好,同时以为这个世界越来越安全,但终究在1001天的时候迎来人生的黑天鹅效应,被屠宰掉。这里很好地说明,实际上安逸和平静的背后,有更深的破涛汹涌。

    书中的黑天鹅事件更多的是来描述社会中的不可预测的大事件,譬如美国911、日本地震……这些是完全不可预测的事件,但给予我积极的思考,一方面想知道极其罕见的不可预测的事件如何潜伏在世间万物的背后,一方面是从黑天鹅事件影射出人类个体在现实生活中的“不可预测”和“未知”。面对这种未知,我们将做出何种改变?

    事前,观念改变,让未知更有意义

    人的本性更倾向于稳定,在稳定中过安稳的日子,譬如说,“温水煮青蛙”就是描述一种趋于安稳的工作状态,而相反如“破釜沉舟”的选择可见其不一般的决心和勇气。相比传统行业来说,走在互联网前沿的同学,这种面对变化的紧迫感或许更强一些。

    我个人的想法,对于重大的社会事件我们无力改变,但对于个人的预测和未知我们可以尽最大努力而为,既然未知是客观存在的,不可避免的,我们就从观念上做出改变,事前储备迎接改变的能力,让未知的变化更有价值和意义。不可预知的事件并不可怕,可怕的是不敢有接受改变的观念和能力。

    反脆弱:变化让我们更坚强

    我的理解,《反脆弱》这本书更像是《黑天鹅》的后续。反脆弱是指在未知不确定发生时,特定事物会变得更加坚强,甚至在不确定性中获益,而脆弱的事物面临压力时会崩溃。用尼采的话来说就是:“杀不死我的,使我更强大。”

    在中国的词汇里,脆弱的反义词是坚强,但本书中,作者认为脆弱的反义词是“反脆弱”,虽然字面上,我不能直观地感受词义,但深思索发现,坚强是一种静态的品质,而反脆弱更像动态的应对,积极的应对或许更能获益。

    总的来说,反脆弱这本书讲述的是在不确定性的生存法则,每一个事物都会在变化中得到利益或蒙受损失,反脆弱让自己避免损失甚至获益,脆弱让自己在不确定中承受损失。当然,脆弱性是有限度以及相对的,如生命的脆弱性以及思想的反脆弱性。永生的不是身体,而是繁衍后代的基因,以及流芳百世的书籍(信息)。

    事后,在不确定性中获益

    书中描述人类有三种人,一种人是从别人的牺牲中受益,一种人是自给自足,自己承担风险,一种人是为了他人的利益而投入成本。前后两种应该是金字塔顶端的人群,占极少数比例,普通大众应该属于第二种人。

    这么来说,不确定的发生一方面是自然性的,一方面是人为转嫁造成的。前者不可避免,后者可以预防。后者比如说生活中的医源性损伤,医生的职责是治病,他总能看到问题所在,而小病对人来说,人体的身体有自愈能力。又如房地产,一方受益,一方牺牲,在中国更为明显。

    而生活中脆弱性也无处不在,书中有个很形象的例子,两个兄弟,一个从事银行业务,一个开着的士载人,从正常的角度看起来,从事银行业务的更趋于稳定,但脆弱性更高,而的哥因为不稳定,更具反击变化的能力。

    反脆弱告诉我们,不管是自然的,还是人为的,在现实社会中,适当的压力和挑战有助于我们提升反脆弱的能力,以至在黑天鹅事件爆发时,我们还能在不确定中获益,在压力中获益,在各种不如意中获益。

    健康,潜伏在身边的“黑天鹅“

    读完两本书,我有两个最直接的感受引发我的思考。一个是潜伏在我们身边最大的黑天鹅事件就是健康。熬夜、不运动、吃垃圾食品以及大环境的污染,彻底荒废了我们的健康。而在我们的观念里,如果给健康划优先级的话,是重要但不紧急的事儿,只有身体释放信息时才会重视。

    在快节奏的生活状态下,经常性地看到大家凌晨2点、3点了甚至更晚,还在讨论需求,还在QQ空间、微信里面发表状态。后半夜的思维确实很活跃,且总觉得熬夜的时间是赚来的,这种状态是非常不利于健康的,或许,努力,先从健康做起。

    另一个思考是关于教育,我一直认为对教育的投资是值得的。不免俗地说,对教育的投资或许是最好的获取反脆弱能力的能量,当然我所说的教育,不是我们曾经在课堂上接受的填鸭式教育,而是在书籍中、在实践中、以及向优秀的人才学习等,对于学习,我最喜欢的词就是“日积月累”。

    在如今快节奏的的奔波中,或许我们忽略的就是我们身边黑天鹅,但万事总无十全十美,在有限的条件下,改变自己的思维方式,尽可能在损益之间寻求平衡,让事物顺其自然的去发展和成长。

    转载自:【“黑天鹅事件”是完全不可预测的,更不可能找出他们的函数关系。我们唯一明智的选择就是,通过建立“反脆弱性”来从中获益,而不是受损】《反脆弱》读书笔记录:黑天鹅事件不可预测,如何从无序和不确定中获利?

    参考:《反脆弱》读书笔记及读后感

    读书笔记PPT :读书笔记ppt对《反脆弱》的笔记





















    展开全文
  • 《站在两个世界的边缘》的作者程浩,网名伯爵在城堡,1993年生,2013年8月21日去世。 一个认真生活过的人。自称“职业病人”的他,坦然接受命运的不公,微笑面对人生的愁苦,他说道:“人消除痛苦的唯一办法就是找到...
    《站在两个世界的边缘》的作者程浩,网名伯爵在城堡,1993年生,2013年8月21日去世。 一个认真生活过的人。

    自称“职业病人”的他,坦然接受命运的不公,微笑面对人生的愁苦,他说道:“人消除痛苦的唯一办法就是找到自己的救赎之路。”而他那些充当救赎之路的文字,有着踏过痛苦后贴近大地的力量。

    了解程浩,从他的知乎开始吧。



    ======书摘======

    站在两个世界的边缘

    程浩

    2013-11-22 18:17:47
    纵然你是一代天骄,坐拥天下,到头来不过化作一抔黄土;纵然你是绝代佳人,艳冠群芳,到头来不过是一具白骨。但是,难道因为死亡是人生的终点,我们就要放弃生命的过程吗?
    2013-11-22 18:22:26
    “真正牛逼的,不是那些可以随口拿来夸耀的事迹,而是那些在困境中依然保持微笑的凡人。” “幸福就是一觉醒来,窗外的阳光依然灿烂。” “也许我们无法明白‘活着’的意义,但是我们已经为‘活着’付出了太多代价;也许我们无法实现自己的梦想,但是我们已经为梦想流下了太多泪水。我们能做的,仅仅是在这条路上走得更远,绝不能回头。天堂未必在前方,但地狱一定在身后。” “生命之残酷,在于其短暂;生命之可贵,亦在于其短暂。” “这些遗留下来的文字是时间的凝固、生命的延续。我们不能改变生命的长度,但我们的精神,将在这些文字中永存。”
    2013-11-22 18:28:04
    程浩的日记里写:“我在不停地解答别人的问题。别人迷惘时,我在不停地指路。我要顾忌到所有的问题,所有的人,我这样也很累,但我很充实。” 在写下这个句子之后,程浩再也没有写一个字,三个月后,他去世了。
    2013-11-22 18:40:50
    幸福就是一觉醒来,窗外的阳光依然灿烂。
    2013-11-22 18:43:20
    就像狂人尼采说的:“凡不能毁灭我的,必使我强大。”正是因为没有上学,我才能有更多的空闲时间用来读书。让我自豪的是,我曾经保持过一天十万字的阅读量。虽然我不知道自己为什么要读书,但是,我觉得这是认真生活的表达方式。
    2013-11-22 18:43:43
    真正牛逼的,不是那些可以随口拿来夸耀的事迹,而是那些在困境中依然保持微笑的凡人。
    2013-11-22 18:45:53
    以前我想,如果有一天我拥有了正常人所拥有的一切,包括健康,可能我就不会像今天这般对生活如此认真。生命之残酷,在于其短暂;生命之可贵,亦在于其短暂。假如有一天,我成为不死不灭的存在,那一刻,我猜自己也会陷入空虚与散漫的漩涡之中,虽生犹死。
    2013-11-25 08:40:10
    不必可怜谁,不必同情谁。所谓生活,不过就是一种“昂着头的艺术”,仅此而已。
    2013-11-25 18:08:52
    那 段日子让我迷茫了很久,也浪费了许多时间。但还好不是一无所获,至少我终于想明白了何为“救赎”。 如果说,失败意味着梦想的破碎,那成功就意味着梦想破损后的再次聚拢。这番缓慢的过程,即是一场“自我的救赎”。我给它取了一个名字——沙海拾贝。 你见过贝壳吗?外表坚硬,里面藏着珍珠,一枚枚地埋在沙滩底下。人们都希望找到最大最亮的那颗珍珠,所以必须亲自动手,刨开粗粝的沙子,撬开坚硬的贝壳。 但是,不是所有贝壳里面都有珍珠,绝大多数贝壳其实都是空的。那怎么办呢?只能放下,再找下一个贝壳。于是,人们只能不断地重复这一系列动作——刨开沙 子,撬开贝壳,再刨开沙子,再撬开贝壳……可能你永远也找不到一颗黄豆大小的珍珠,但是你知道——贝壳里面有珍珠,不是这一个就是下一个。 史铁生老师当年将大段的生命与时光漫布在地坛的每一处角落,我想就是这样一个沙海拾贝的过程。后来我看过电影《肖申克的救赎》。当我看见安迪用二十年的时 间洞穿监狱的围墙,细碎的石子从他口袋里滑落时,我更加坚信——所谓“自我救赎”,即是一个沙海拾贝的漫长过程。
    2013-11-25 18:26:55
    杰伦在公司坐了一年的冷板凳,始终毫无建树。有一天,吴宗宪找到他说:“如果你十天之内能写出五十首歌,我就从中挑出十首歌,给你出一张专辑。” 杰伦知道这是自己唯一的机会。他先去买了一整箱的方便面,然后把自己关进工作室十天十夜。后来方文山回忆道:“他那次完全拼了,居然写歌写到流鼻血……” 十天之后,同名专辑《Jay》横空出世,当年在台湾拿下五十万张的销量。自此,周杰伦的名字,一炮而红。 如今,距离《Jay》的推出已经过了十三年。才华横溢的杰伦,似乎也到了“江郎才尽”的尴尬境地。但是,他的这段经历,却一直让我记忆犹新:一个男生,可以不帅,可以不念书,可以没钱,可以不善言谈,但是一定要对自己所钟爱的事业认真!否则,你的一生也就这样了。 就像杰伦后来在《四面楚歌》中唱的: 我不知道我有没有勇气 拆下他们的面具 我只知道好像 认真的男人最美丽
    2013-11-25 18:39:42
    这 是一个跟主题毫无关系的故事,我只是想用它来引述一个观点:一个“有品有趣有范儿有腔调的男生”是什么样儿,我不知道;我只知道,一个“有品有趣有范儿有 腔调的男生”,绝不应该是靠有意识的、甚至是极其刻意的外在行为装点出来的。而且所谓的“有品有趣有范儿有腔调”,实际上就是一种不可复制的个人魅力,是 一张极具个人特色的名片。如果这种个人魅力是具有可复制性的,是能够用“一二三四五”的行为准则来具体化的,是每个人“照猫画虎”都能学出来的,那“有品 有趣有范儿有腔调的男生”岂不是变成了流水线上的标准化产品?若能够成为合格的标准化产品已然是最幸运的结果,怕只怕到时变成“画虎不成反类犬”的残次 品,那可就再难“回炉重铸”了。 一个男生,干净卫生,热爱运动,打扮得体,合理消费,醉心收藏,热爱读书,有领导意识,脚踏实地,这些都是难能可贵的优秀品质。但是,一旦把这些细则提升 到一个“优质(暂时把有品有趣有范儿有腔调统称为优质)男生”的应有高度,就会出现一个很大的问题:是不是只要做到这些就能成为一个“优质男生”?如果真 是如此,那这样的“优质男生”未免显得太过浅薄,太过流于表面。 一个人的精力毕竟是有限的,过于重视自己外在行为的优雅与否,必然带来内心世界的空洞与贫乏。 那真正的“优质男生”应该是什么样儿? 这个问题其实不可能有一个公认的标准答案,就像你永远不可能从“川鲁淮粤”四大菜系中,选出一道全国人民都爱吃的菜。因为每个人的口味不同,审美情趣更不 同。但是我想,总有一些本质上的东西是不会变的,比如认真。而人与人之间的区别,很大程度上也是由认真指数的多少来决定的。尤其对于男生而言,认真这点则 显得更为重要。因为对人对事的认真程度,直接决定了你对其投入的时间、精力和感情的多与少;对工作的认真程度,决定了经济与物质;对感情(亲情、友情、爱 情)的认真程度,决定了人际关系;对爱好的认真程度,决定了层次和趣味。还有很多类似的例子,不胜枚举。 在我的价值观里,从来不会认为一个人口若悬河地谈论几句自己不知道的东西,就觉得对方是一个有品有趣的男生。这个世界上,你不知道的东西,总比你知道的要 多。知道的少,自己去学、去了解就好,这与一个人是不是有品有趣无关。如果以谈资的多与少来作为评判依据,那人人都是有品有趣的,因为你知道的东西,总有 人不知道。如果有品有趣是攀比心如此强烈的东西,那这样的品,只能是低品;这样的趣,只会恶趣。 站在知识的维度上,这世间没有谁敢说自己是一个有品有趣的人。
    2013-11-25 18:44:41
    一 个人是不是有范儿有腔调,这一点永远无法通过主观意识表现出来。换言之,你越是想成为某一种人,你就越是无法变成那样的人。因为你始终束缚在一个条条框框 里,它就像一个说明书,告诉你什么是潇洒,什么是幽默,什么是文化,什么是气质。可是,即便你真的做到了又能如何?你表现出了潇洒的气质就意味着你真的潇 洒了吗?你只是演得潇洒,装得潇洒而已。 在我看来,想要变得“有品有趣有范儿有腔调”是一个挺难的目标。难点就在于,这个评价权不在你的手里而在别人手上;别人说你太张狂,你就要夹紧尾巴;别人 说你太冷漠,你就要笑脸相迎;别人说你不幽默,你就要满嘴跑火车;别人说你懂得少,你就要背冷知识。想获得“有品有趣有范儿有腔调”的评价实在太难了。因 为这个评价的第一步就是先把自己变成别人嘴里的提线木偶,而不是一个有独立思想的人。
    2013-11-26 08:27:29
    其 实,类似于“谁应不应该向谁学习”的问题,根本就没有什么实质性的意义。我们总是习惯借鉴别人的经验,效仿别人的成功,重走别人的老路。我们何时能够真正 按照自己的意愿去活一次。不管是作为男人还是作为女人,热爱生活,热爱家庭,热爱事业,热爱梦想,更重要的是,热爱真实的自己,这就已经足够了。向谁学习 都不如相信自己。也许是我太过天真,总是妄图用真实、善良、美丽的“血肉之躯”来冲击冰冷、黑暗、丑陋的“现实围墙”。我当然明白自己的想法是多么苍白无 力,但是我始终在坚持,始终在相信。不管这个世界有多么现实,你的心中都应该保留一份天真。 还是几年前,中央二套的《对话》栏目中,一位大四女生提问说:“现在社会上都说‘学得好不如嫁得好’,请问这一点是否有道理?”当时担任主持人的王利芬老 师听了,对她说: “别让时代的悲哀,成为你人生的悲哀。”
    2013-11-26 08:28:37
    的 确,从某种角度上讲,我是一个不太容易相信的人。我不相信主流媒体,也不相信小道消息;我不相信专家教授,也不相信网民分析;我不相信公开示威,也不相信 匿名揭露;我不相信公权力,也不相信多数民意;但是这并不意味着我就是一个彻头彻尾的怀疑论者。我也有自己一直相信,且愿意为之付出生命的坚定信仰。那就 是人与人之间的感情和自己的梦想。试想一下,如果有一天,你和自己所爱之人的相遇,这样美好的记忆都会为日后彼此怀疑留下充足的想象空间,那这样的世界未 免太过阴暗,这样的人心未免太过险恶;这样的爱情,我们拿什么理由去相信?
    2013-11-26 17:42:12
    我 相信,这世上没有任何一个真正特立独行的人,会将“特立独行”当作自己的本意。而刻意追求“特立独行”的人,最后都不免沦为一个哗众取宠的俗众。只因, “特立独行”不是一种行为,不是一种气质,不是一种追求,更不是一项能够供人思前想后的选择。它是一种反抗,是一种受到强大压迫之后,内心深处产生的反抗 意识。这种压迫通常来自于两个方面——即环境与精神。前者如王小波,后者如黄家驹。
    2013-11-26 17:54:15
    其 实我不爱看韩剧,但是这并不重要。因为我的目的根本就不是看什么剧,而是让老妈高兴。只要她高兴了,我的目的就达到了。我不在乎自己看的是韩剧、美剧还是 京剧。 这件事情,让我开始反思一个问题:我们经常听到有人说“我爱我的父母,我以后一定好好孝顺他们”,“我爱我的妻子,我将来一定让她幸福”,或者是“我爱我 的孩子,他将来就会明白我的苦心”。这不是我们对他们的爱,而是我们想象中的爱。这种想象中的爱,让我们以为自己很爱对方,自己所做的一切都是为了对方。 可是结果呢?对方却一点都没有感受到,反而对你满是抱怨。换句话说,你的爱其实放了空枪。 这就好像有人说她想要一颗苹果,而你却送给她一车香蕉。她虽然收下香蕉,但是每天闷闷不乐。你质问她:“为什么我给了你一车香蕉,你还不高兴?”她说: “我想要的是一颗苹果,而你却只给了我一车香蕉。” 有时候,我们必须要明白,你付出的爱,究竟想要收获怎样的效果?是让对方感受到你的爱,还是让你感受到自己在爱对方?是付出爱的行为重要,还是付出爱的方 式重要? 也许在你眼里,香蕉比苹果更美味。但是你的想法无关紧要。因为无论是香蕉还是苹果,最后吃的人都不是你。
    2013-11-27 08:26:14
    几米说过:“每个人都有一双翅膀;有的人长在脚上,有的人长在手上,有的人长在头上,有的人长在心上。翅膀长在哪里,你的天赋就在哪里。” 残缺也好,不完整也好,每个人都有自己难以启齿的一面。但是说真的,没有人会在乎你。人们不会对你的缺陷念念不忘,人们只会在你最春风得意的时候,突然想起来:“哦?那家伙不是少两根手指吗?这也能办到,好厉害……” 你失败一千次也不会有人记得你,因为人们只会记住你成功的一次。
    2013-11-27 08:27:48
    看过《盗梦空间》的朋友可能记得,影片中莱昂纳多告诉我们:“我们都知道梦是假的,可是我们在梦里却相信那是真的。我们都相信现实是真的,可是你怎么能肯定这不是另一场梦境?”
    2013-11-27 09:10:35
    写 作的过程是一个思维整理与归纳的过程,不在于你写了什么,而在于你写了多久,写了多少。举一个例子:假如你的名字就是知乎的一个专栏,发稿频率是一周一 篇,关注者就是专栏的发行量,赞同数和感谢数就是读者的反响,评论就是读者的来信,那么作为专栏的作者,你该如何维护这个专栏的品牌?又该如何保证写出高 质量的内容?在大局已定(各领域的大牛)的知乎江湖,默默无闻的你如何才能闯出一片天地?你读了那么多书,此刻它们能帮你解决几个问题?如果一个都解决不 了,它们能否成为你创作的素材?在实践的过程当中,你发现自己的短板是什么? 思考上述这几个问题,难道不比你整日无病呻吟地咀嚼那点儿“孤独感”来的更有意义吗? 说到底,你读书,不管是一千本还是一万本,那只是消费。而写作,哪怕只有一个字和一句话,那也是生产。生命是短暂的,要学会利用有限的时间,书写关于自己 的历史。 我常常想,一个人年轻的时候,就像一块干瘪的海绵,要想尽办法去吸收更多的水分,这么做就是为了有朝一日能够释放自身的能量。而一块不懂得释放的海绵,即 使吸收再多的水分,也最多只是一个臃肿的水货而已。 对生活不满,对人生不满,对自己不满,那就努力成为一个让自己满意的人,而不是拿书来说事儿。书,只能是书,不能是别的。
    2013-11-27 17:14:46
    以我十年读龄悟出的一个浅薄道理来看:一切抄捷径的行为,最后被证明都是在走弯路;一切阻挡我们的困难都应该正面解决,因为那才是走直线。
    2013-11-27 17:18:30
    读 书一定不要畏难。 难,是一件幸事。 难,如同一道门槛;跨过门槛,你就和身后的普通人拉开了距离。 有人说,读书也要讲资格、讲缘分。读不懂《偶像的黄昏》,说明你没有资格读尼采,说明你和尼采没有缘分,所以你就不应该读尼采。 对于这样的观点,我是不敢苟同的。 读书的过程就像爬楼梯,总有一些书籍在楼上俯瞰我们,也有一些书籍在楼下仰视我们,还有一些书籍跟我们保持在同一层台阶。每当我们拿起一部深奥的作品,便 如同抬步上楼一般——怎一个“累”字了得! 但是如果因为怕苦怕累,我们就止步不前,不仅不“更上一层楼”,反倒为了图轻松而走下坡路,这不正应了那句老话——黄鼠狼下崽,一窝不如一窝了嘛! 读不懂尼采,可以读哲学史。像一个侦探般,去书里寻找对尼采影响最大的人。追根溯源,找出西方哲学的发展脉络,了解他们的哲学思想,以及他们的学说对后世 产生了哪些意义深远的影响。这时,你再读尼采,总要好过当初吧?即便仍然读不懂,那也无妨,说不定你此时已经恋上康德了! 读书,翻开诵读就好。读不懂,想办法读懂。无关的,不必多说,更不必多想。
    2013-11-27 17:18:57
    我有一个读书的自我规定:但凡遇到不懂的知识,想尽办法也要弄懂,哪怕它毫无用处;但凡遇到内容艰深的书籍,一定要找到关于此书的入门书籍,为他日之阅读作一番铺垫。 读书也好,做事也罢,都不应该有畏难情绪,而是应该迎难而上。越是读不懂,越是有读懂的必要;越是有必要读懂的书籍,读过以后的收获就越大。知识的价值与其掌握者的人数是成反比的。含金量越高的知识,掌握者必然越少。掌握者越多的知识,其价值也就越低。
    2013-11-27 17:19:37
    孤独有真伪之分。毫不客气地说,现代人的孤独都是装出来的。因为孤独的标准实在太高,一般人没资格孤独。人际交往上受点儿挫折就喊孤独,那是心理脆弱,与孤独无关。所以,任何人的孤独,如果未达到汉语词典所解释的程度,皆是伪孤独。
    2013-11-27 17:24:22
    作 为一个自幼卧病在床的“职业病人”而言,读书带给我的好处是不言而喻的。 如果没有读书,我可能是一个大字不识的文盲;如果没有读书,我可能认为世界就是家到医院的距离;如果没有读书,我可能认为生活不过吃喝二字;如果没有读 书,我可能一生都无法经历那么多人物带来的感情。 但是,读书带给我的好处,恰恰是它带给我的最大“危害”。 如果没有读书,我就不会对人生产生期待,那样就更容易获得满足;如果没有读书,我就不会了解世界是多么精彩,那样就不会向往独自远行;如果没有读书,我的 心中就不会孕育出那些蓬勃跳动的梦想,那样就不会轻易感到失望;如果没有读书,我可能永远都不明白两个人的甜蜜,那样就不会尝出一个人的苦涩。 假使我是一个智力归于零的智障者,那我就不会因为梦想的遥远而黯然神伤,也不会因为爱情的渺茫而伤心欲绝,更不会因为一腔豪情的无处宣泄而郁郁寡欢。如果 我失去思考的能力,我相信自己会比现在过得更幸福。 但是,这样的人生还值得活着吗?如果连痛的滋味都不知道,那才是真正的绝望。 说到底,甜和苦都是人生的一种滋味。 读书的好处是启迪人类的思想,危害是思想带来的痛苦。无论是好处还是危害,它们就像甜与苦一样,都是人生的一种滋味。
    2013-11-27 17:29:13
    四五岁的孩子,特点是什么? 一是好动,二是模仿能力强。 这个年纪,你培养他读书的习惯,要他坐在椅子上一动不动,那比杀了他都难受,说不定以后还会厌恶读书。 你能做的,就是给他一个良好的模仿对象。你若想让他读书,自己就要先读书,尤其是在他面前读书。让他觉得读书就像是男人的酒,女人的高跟鞋,带有一种象征性。他就会迫切地想去尝试。 孩子的读书习惯不能靠刻意培养,而要提供给他一个良好的读书氛围。 我以前说过: 中国家庭教育之悲哀,在于长辈惯于言语说教,少有身体力行的示范。
    2013-11-27 17:30:45
    看书可以丰富一个人的社会阅历吗? 我在知乎上多次表达过一个观点:书,只能是书,不能是别的。 现在很多人总是误以为,读书能带来许多改变。而且认为这种改变是革命性的,能把一个不学无术的人,变成一个博学多才的人;能把一个不善言谈的人,变成一个能说会道的人。其实这样的可能性,极小。 读书固然能给人带来改变,但是这改变尚不足以使人脱胎换骨。即便能带来某些改变,也需要付出漫长的时间和极大的毅力,就像契诃夫的《打赌》描写的一样。 读书的改变是潜移默化的,不是立竿见影的。当你抱着“改变自己”的心态去读书时,过一段日子你就会发现自己其实改变很小。而当你真正全情投入到知识的海洋时,你才会不知不觉被书里的思想塑造得更加完善。 所以,看书能不能丰富一个人的社会阅历,这不好说。但是可以肯定,“纸上得来终觉浅,绝知此事要躬行”这句话用在此处,必然没错。 想丰富自己的社会经历,最好的方法当然还是走向社会。卖报纸,送快递,搬仓库,不管这份工作有没有技术含量,它都足以让你认识这个社会,而且比读书认识得更深。 书,只能是书,不能是别的。
    2013-11-27 17:31:58
    没 时间读书怎么办? 关于读书的问题,我已经回答过很多次了。其实道理就是那么几个,多说几遍也不怕别人说我炒冷饭。 总是有很多人喜欢问:“没有时间读书怎么办?读书心不静怎么办?” 我不知道这些人口中的“时间”是怎样的概念。但是我认为,一个再忙碌的人,一天24小时总能有1小时的空余时间吧,哪怕不是连续的,至少也能是累计的。难 道不能用累计的零碎时间来读书吗?古人谈读书有三上:“厕上、马上、枕上。”现代人读书也应该有三上:“车(公交车)上、队(排队等候)上、网上。”这些 都是时间,为什么不读?这个世界上除了学生,没有人是拿专门的时间来读书的,家庭与工作才是一个人生活的主旋律。专门拿时间来读书,未免太过奢侈。不会利 用空余时间读书的人,即使有大把的时间也不会读书。
    2013-11-27 17:33:51
    想读书,就要认真对待读书这件事,不要把读书当作生活的点缀,而是当作生活的习惯。 读书是一种习惯,是一种态度。就像一天三顿饭,到点就要吃,吃不着就心慌,要主动找食儿吃,而且非吃着不可。等吃到嘴里,安心了,泰然了,该DOTA就DOTA,该睡觉就睡觉,该嘿咻就嘿咻。
    2013-11-27 17:49:25
    在我眼里没有“好书”与“坏书”的区别,任何知识都是可以拿来运用的,只有将知识转化为现实,才能诞生它最大的价值。
    2013-11-28 21:26:56
    你认为怎样的人生很酷(有趣)? 当你来到这个世界时,人们笑着,你哭着;当你离开这个世界时,人们哭着,你笑着。
    2013-11-28 21:37:15
    知友:有皮肤病是不是这辈子谈不了恋爱了? 程浩:每个人身上都有卑怯的短处。 这不重要。 重要的是你有没有牛逼的长处来掩盖它。
    2013-11-28 21:37:55
    知友:你反感男人的哪些行为? 程浩:趁着酒劲儿向女孩表白。 不仅不尊重女孩,还有逃避责任的嫌疑(酒醒不认账),最起码也说明这个男人缺少直面内心的勇气。试想,一个男人如果连瞬间的勇敢都没有,谁又能相信他有保护女孩一生的勇气?所以,大胆说出爱,即使被拒绝,倒在心爱的女人面前,也是一个男人这辈子最大的光荣。
    2013-11-28 21:39:11
    知 友:读普通大学是否绝大部分就意味着普通的工作、普通的人生? 程浩:如果你是黄金,烧得时间越久,你便越是发光发亮;如果你是煤炭,那即使烧得火红,仍然免不了灰飞烟灭;如果你是一粒种子,即使被人踩进泥土里,也会 生根发芽,长成一株参天大树;如果你是一颗杂草,那即使生长在泰山之巅,也会被诗人踩在脚下,永生永世无人问津;如果你是一叶孤舟,即使存于青山绿水之 间,也不过是一艇供人渡河的小船而已;如果你是泰坦巨轮,那即使毁于汪洋深海之渊,你仍然承载着杰克与萝丝的伟大爱情,世人永远铭记。 一个人的成就与否,环境固然重要,但是最重要的还是你自身的质地。
    2013-11-28 21:42:38
    知友:“等爱人一百夜,在最后一晚离开”的故事,到底是在表达什么? 一个风流名士迷上了一个妓女,而她却对他说:只要你在我的花园里坐在我窗下的一张凳子上等我一百个通宵,我便属于你了。到了第九十九个夜晚,那位雅客站了起来,扶着凳子走开了。 ——罗兰《恋人絮语》 程浩:爱情是两个人的努力。 男人等了她九十九夜,他希望最后一夜对方能来主动找他。否则最后一夜等来的,只能是失望。 毕竟,一厢情愿不是爱。 爱情就是相距一百步的两个人,彼此慢慢靠近。 因为爱,我可以向你狂奔九十九步。 然而,无论我付出多少努力,却永远无法真正靠近你。因为爱,不光是我迈出的九十九步,还有你尚未迈出的那一步。 少一米、一寸、一分、一厘,都不是爱情。 一步之遥,天涯海角。
    2013-11-28 21:46:54
    你看见别人演讲,声情并茂,侃侃而谈,引得台下掌声雷动。 可是,你要知道,对方为什么讲得这样好? 那是因为他准备了一万字的讲稿,内容都是对方迫切想要告诉别人的——他需要足够的篇幅去表达。 但是,这一万字的讲稿,对方全都表达了吗? 答案是没有。人家只允许他讲三千字。 所以,他虽然有许多想要表达的内容,却不得不有所取舍——他只能选择最重要的内容去表达。 所以,观众听到的演讲,是浓缩后的精华。自然非常精彩。 现在,我们退回到你的问题:想写长篇小说,但是写不出,怎么办? 一般来说,长篇小说的篇幅大多在十万字以上,而一部十万字的作品,不可能只有十万字,必然有被删减的篇幅。 我的问题就是:在你的心中,是否有一个超过十万字的表达内容? 我盲目猜测一下:你没有。 你不光没有长篇小说的表达内容,甚至连一个短篇小说的表达内容都没有。你只是单纯地想写一部长篇小说,却不知道该写什么内容。 有一个成语可以形容你的这种状态:本末倒置。 写长篇,是因为你有一段故事要说,而不是为了写长篇,凭空捏造一段故事或者灵感。 多想点儿写作内容,少想点儿写作形式。 最重要的是——不要老问怎么写,先写下来。
    2013-11-29 08:17:04
    知友:你如何看待“你寒窗苦读十几年,毕业后辛苦工作做房奴,而小学同学早年辍学外出闯荡,如今开豪车住别墅”这一现实? 程浩:一个人,如同天空落下的一滴雨水。不是每一滴水都要盛进温室的鱼缸或者花瓶中的。这不是水的宿命,也不是水的必然结果。 在滚烫的高温中,一滴水可以变成升腾的气体;在寒冷的极地中,一滴水可以变成透明的冰凌。即使是一滴水,只有你愿意咬紧牙关穿越肮脏污秽的下水道,你最终也一样可以流向蔚蓝的海洋。 可是你没有勇气。因为任何一条与社会主流价值观相背的路,都存在所谓的“鸡飞蛋打、一无所有、竹篮打水一场空”的风险。你会遇到前所未有的阻力,其中有来自家庭的,也有来自社会的,也有来自内心的。所以你不敢。 绝大多数的水都免不了被灌进鱼缸、花瓶,等待鱼粪和植物腐烂的污染,最终被倒进马桶的命运。 放心好了,还会有干净、新鲜的水来补充你的位置。
    2013-11-29 08:35:46
    知 友:如何衡量一个人的价值? 程浩:人是一种希望体现自我价值的动物,不管你嘴上承不承认,心里都是迫切渴望得到赞美和认同的。但是外界对一个人的评价,往往不能代表他的真正价值,因 为其中掺杂了太多的附加值,比如你自身的权力和地位,或是他人对你的奉承和怜悯。如果一个人的价值取决于外界对你的评价,那无论你获得多高的成就,你都不 会对自己感到真正的满足,因为你一直活在别人的嘴里。换句话说,你的存在没有根基,而一个人要是没有存在的根基,也就没有存在的意义,更没有存在的价值。 所以我想,衡量一个人的价值,最公正、合理的标尺,应该是你自己对自己的定位和期许。比方说定位。你看看那些手表,时针、分针、秒针,它们一刻不停地转 动,可最便宜的也就十几块钱一块,但是给它加上一颗钻石,马上就身价倍增,这公平吗?一块表的价值高低取决于钻石,但是谁敢说指针的价值就低于钻石?实力 或许有强有弱,智商或许有高有低,背景或许有深有浅,但是这些都不是衡量一个人价值的关键因素。关键在于,你是不是真的无可替代? 再来说期许。我始终坚信,一个人活着的价值,在于他对自己未来的期许。这样的人,往往都有一个明确的目标,活着即是为了完成它。这样的人,不是活在现实世 界的,而是活在未来世界的。正是因为相信自己的价值会体现在未来,所以他们能够忍受现实中的一切失意。只要目标还没完成,自己就永远有存在的价值。 一个人的价值,不是让别人来衡量,而是由自己来确立。生的价值,死的价值;是轻于鸿毛,还是重于泰山,都由你来决定。
    2013-11-29 18:38:53
    提 问与回答,看似简单,实则需要一个良好的讨论氛围。提问者与回答者都应该具有认真、严肃、包容和理性的精神。这样的交流环境,可以在知乎上遇到,但是在生 活中却很难。生活中的人们往往并不在意问题与回答的内容,而是更在意提问者与回答者的身份和地位。就像在酒桌上,不管领导说了一个多么愚蠢的下三路问题, 总能有人随声附和,拍手叫好。这种时候,谁会纠正领导的错误?谁又会在乎这个问题的正确与否? 一个问题,需要一个答案;一个答案,需要一位好的回答者。 但是,一个回答者需要什么?我认为是需要一个态度诚恳的提问者。如果提问者对自己的问题都是“不求醍醐灌顶,但求一吐为快”的吐槽心理,那无论回答者写出 什么振聋发聩的至理名言,都不过是对牛弹琴而已。只不过生活中的“牛”看起来比知乎更多。 生活中对于别人的问题,我不会告诉他什么是对,什么是错,尤其是观念上的问题,我更不会发表什么意见。我只会告诉他,如果是我,我会如何如何。说不说是我 的事儿,听不听是他的事儿。一个态度不诚恳的问题,是不必回答的;一场虚假的交流,是不必认真的。
    2013-11-29 18:48:47
    知友:对研究生所学专业不感兴趣,应该退学吗? 程浩:送你一句话。 “问问自己要什么?看看自己有什么?想想自己能放弃什么?” ——程浩 不喜欢给别人的人生指点迷津。上面这句话好好揣摩吧,自己勇敢做出选择。
    2013-11-29 18:50:50
    知 友:你认为你妈妈是爱你多些还是爱你爸爸多些? 程浩:我认为,中国许多较为典型的家庭矛盾,其根源在于家长将父/母子关系,摆在其他亲属关系的前面。这种做法是导致孩子长大后,思考问题总是以自我为中 心的主要原因。 中国比较常见的一个场景,就是父母一回家,先和孩子发生亲昵动作(搂抱、亲亲),绝对不会一进门就跟自己的配偶拥抱、亲吻。这当然跟中国人含蓄内敛的性格 特质有关,但是这种做法其实非常不好。越是当着孩子的面儿,你越是应该表现出配偶对自己的重要性。换一句话说,要让孩子意识到,在家庭这个小社会里,夫妻 关系是优先于父/母子关系的。 夫妻之间的爱,决定了孩子对父母的爱。
    2013-11-29 18:54:26
    男人的自信跟身高毫无关系,而是看他有没有敢于担当的勇气。


    展开全文
  • 本文介绍了Java序列化的基本概念,序列化和序列化的使用方法,以及实现原理等,比较全面地总结序列化相关知识点,并且使用具体例子来加以佐证。 具体代码在我的GitHub中可以找到 ...

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    https://github.com/h2pl/Java-Tutorial

    喜欢的话麻烦点下Star、Fork、Watch三连哈,感谢你的支持。

    文章首发于我的个人博客:

    www.how2playlife.com

    本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。

    本文参考 http://www.importnew.com/17964.html和
    https://www.ibm.com/developerworks/cn/java/j-lo-serial/

    序列化与反序列化概念

    序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化。

    Java对象的序列化与反序列化

    在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用该对象。但是,我们创建出来的这些Java对象都是存在于JVM的堆内存中的。

    只有JVM处于运行状态的时候,这些对象才可能存在。一旦JVM停止运行,这些对象的状态也就随之而丢失了。

    但是在真实的应用场景中,我们需要将这些对象持久化下来,并且能够在需要的时候把对象重新读取出来。Java的对象序列化可以帮助我们实现该功能。

    对象序列化机制(object serialization)是Java语言内建的一种对象持久化方式,通过对象序列化,可以把对象的状态保存为字节数组,并且可以在有需要的时候将这个字节数组通过反序列化的方式再转换成对象。

    对象序列化可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。

    在Java中,对象的序列化与反序列化被广泛应用到RMI(远程方法调用)及网络传输中。

    相关接口及类

    Java为了方便开发人员将Java对象进行序列化及反序列化提供了一套方便的API来支持。其中包括以下接口和类:

    java.io.Serializable
    
    java.io.Externalizable
    
    ObjectOutput
    
    ObjectInput
    
    ObjectOutputStream
    
    ObjectInputStream
    
    Serializable 接口
    

    类通过实现 java.io.Serializable 接口以启用其序列化功能。

    未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。 (该接口并没有方法和字段,为什么只有实现了该接口的类的对象才能被序列化呢?)

    当试图对一个对象进行序列化的时候,如果遇到不支持 Serializable 接口的对象。在此情况下,将抛出NotSerializableException。

    如果要序列化的类有父类,要想同时将在父类中定义过的变量持久化下来,那么父类也应该集成java.io.Serializable接口。

    下面是一个实现了java.io.Serializable接口的类

    public class 序列化和反序列化 {
    


    ​ public static void main(String[] args) {

    ​ }
    ​ //注意,内部类不能进行序列化,因为它依赖于外部类
    ​ @Test
    ​ public void test() throws IOException {
    ​ A a = new A();
    ​ a.i = 1;
    ​ a.s = “a”;
    ​ FileOutputStream fileOutputStream = null;
    ​ FileInputStream fileInputStream = null;
    ​ try {
    ​ //将obj写入文件
    ​ fileOutputStream = new FileOutputStream(“temp”);
    ​ ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
    ​ objectOutputStream.writeObject(a);
    ​ fileOutputStream.close();
    ​ //通过文件读取obj
    ​ fileInputStream = new FileInputStream(“temp”);
    ​ ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
    ​ A a2 = (A) objectInputStream.readObject();
    ​ fileInputStream.close();
    ​ System.out.println(a2.i);
    ​ System.out.println(a2.s);
    ​ //打印结果和序列化之前相同
    ​ } catch (IOException e) {
    ​ e.printStackTrace();
    ​ } catch (ClassNotFoundException e) {
    ​ e.printStackTrace();
    ​ }
    ​ }
    ​ }

    class A implements Serializable {
    
        int i;
        String s;
    }
    

    Externalizable接口

    除了Serializable 之外,java中还提供了另一个序列化接口Externalizable

    为了了解Externalizable接口和Serializable接口的区别,先来看代码,我们把上面的代码改成使用Externalizable的形式。

    class B implements Externalizable {
        //必须要有公开无参构造函数。否则报错
        public B() {
    
        }
        int i;
        String s;
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
    
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    
        }
    }
    
    @Test
        public void test2() throws IOException, ClassNotFoundException {
            B b = new B();
            b.i = 1;
            b.s = "a";
            //将obj写入文件
            FileOutputStream fileOutputStream = new FileOutputStream("temp");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(b);
            fileOutputStream.close();
            //通过文件读取obj
            FileInputStream fileInputStream = new FileInputStream("temp");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            B b2 = (B) objectInputStream.readObject();
            fileInputStream.close();
            System.out.println(b2.i);
            System.out.println(b2.s);
            //打印结果为0和null,即初始值,没有被赋值
            //0
            //null
        }
    

    通过上面的实例可以发现,对B类进行序列化及反序列化之后得到的对象的所有属性的值都变成了默认值。也就是说,之前的那个对象的状态并没有被持久化下来。这就是Externalizable接口和Serializable接口的区别:

    Externalizable继承了Serializable,该接口中定义了两个抽象方法:writeExternal()与readExternal()。

    当使用Externalizable接口来进行序列化与反序列化的时候需要开发人员重写writeExternal()与readExternal()方法。由于上面的代码中,并没有在这两个方法中定义序列化实现细节,所以输出的内容为空。

    还有一点值得注意:在使用Externalizable进行序列化的时候,在读取对象时,会调用被序列化类的无参构造器去创建一个新的对象,然后再将被保存对象的字段的值分别填充到新对象中。所以,实现Externalizable接口的类必须要提供一个public的无参的构造器。

    class C implements Externalizable {
        int i;
        int j;
        String s;
        public C() {
    
        }
        //实现下面两个方法可以选择序列化中需要被复制的成员。
        //并且,写入顺序和读取顺序要一致,否则报错。
        //可以写入多个同类型变量,顺序保持一致即可。
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeInt(i);
            out.writeInt(j);
            out.writeObject(s);
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            i = in.readInt();
            j = in.readInt();
            s = (String) in.readObject();
        }
    }
    
    @Test
        public void test3() throws IOException, ClassNotFoundException {
            C c = new C();
            c.i = 1;
            c.j = 2;
            c.s = "a";
            //将obj写入文件
            FileOutputStream fileOutputStream = new FileOutputStream("temp");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(c);
            fileOutputStream.close();
            //通过文件读取obj
            FileInputStream fileInputStream = new FileInputStream("temp");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            C c2 = (C) objectInputStream.readObject();
            fileInputStream.close();
            System.out.println(c2.i);
            System.out.println(c2.j);
            System.out.println(c2.s);
            //打印结果为0和null,即初始值,没有被赋值
            //0
            //null
        }
    

    序列化ID

    序列化 ID 问题
    情境:两个客户端 A 和 B 试图通过网络传递对象数据,A 端将对象 C 序列化为二进制数据再传给 B,B 反序列化得到 C。

    问题:C 对象的全类路径假设为 com.inout.Test,在 A 和 B 端都有这么一个类文件,功能代码完全一致。也都实现了 Serializable 接口,但是反序列化时总是提示不成功。

    解决:虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。清单 1 中,虽然两个类的功能代码完全一致,但是序列化 ID 不同,他们无法相互序列化和反序列化。

    package com.inout; 
     
    import java.io.Serializable; 
     
    public class A implements Serializable { 
     
        private static final long serialVersionUID = 1L; 
     
        private String name; 
        
        public String getName() 
        { 
            return name; 
        } 
        
        public void setName(String name) 
        { 
            this.name = name; 
        } 
    } 
     
    package com.inout; 
     
    import java.io.Serializable; 
     
    public class A implements Serializable { 
     
        private static final long serialVersionUID = 2L; 
        
        private String name; 
        
        public String getName() 
        { 
            return name; 
        } 
        
        public void setName(String name) 
        { 
            this.name = name; 
        } 
    }
    

    静态变量不参与序列化

    清单 2 中的 main 方法,将对象序列化后,修改静态变量的数值,再将序列化对象读取出来,然后通过读取出来的对象获得静态变量的数值并打印出来。依照清单 2,这个 System.out.println(t.staticVar) 语句输出的是 10 还是 5 呢?

    public class Test implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        public static int staticVar = 5;
     
        public static void main(String[] args) {
            try {
                //初始时staticVar为5
                ObjectOutputStream out = new ObjectOutputStream(
                        new FileOutputStream("result.obj"));
                out.writeObject(new Test());
                out.close();
     
                //序列化后修改为10
                Test.staticVar = 10;
     
                ObjectInputStream oin = new ObjectInputStream(new FileInputStream(
                        "result.obj"));
                Test t = (Test) oin.readObject();
                oin.close();
                 
                //再读取,通过t.staticVar打印新的值
                System.out.println(t.staticVar);
                 
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    

    最后的输出是 10,对于无法理解的读者认为,打印的 staticVar 是从读取的对象里获得的,应该是保存时的状态才对。之所以打印 10 的原因在于序列化时,并不保存静态变量,这其实比较容易理解,序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。

    探究ArrayList的序列化

    ArrayList的序列化
    在介绍ArrayList序列化之前,先来考虑一个问题:

    如何自定义的序列化和反序列化策略

    带着这个问题,我们来看java.util.ArrayList的源码

    public class ArrayList<E> extends AbstractList<E>
            implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    {
        private static final long serialVersionUID = 8683452581122892189L;
        transient Object[] elementData; // non-private to simplify nested class access
        private int size;
    }
    

    笔者省略了其他成员变量,从上面的代码中可以知道ArrayList实现了java.io.Serializable接口,那么我们就可以对它进行序列化及反序列化。

    因为elementData是transient的(1.8好像改掉了这一点),所以我们认为这个成员变量不会被序列化而保留下来。我们写一个Demo,验证一下我们的想法:

    public class ArrayList的序列化 {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            ArrayList list = new ArrayList();
            list.add("a");
            list.add("b");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("arr"));
            objectOutputStream.writeObject(list);
            objectOutputStream.close();
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("arr"));
            ArrayList list1 = (ArrayList) objectInputStream.readObject();
            objectInputStream.close();
            System.out.println(Arrays.toString(list.toArray()));
            //序列化成功,里面的元素保持不变。
        }
    

    了解ArrayList的人都知道,ArrayList底层是通过数组实现的。那么数组elementData其实就是用来保存列表中的元素的。通过该属性的声明方式我们知道,他是无法通过序列化持久化下来的。那么为什么code 4的结果却通过序列化和反序列化把List中的元素保留下来了呢?

    writeObject和readObject方法

    在ArrayList中定义了来个方法: writeObject和readObject。

    这里先给出结论:

    在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化。

    如果没有这样的方法,则默认调用是 ObjectOutputStream 的 defaultWriteObject 方法以及 ObjectInputStream 的 defaultReadObject 方法。

    用户自定义的 writeObject 和 readObject 方法可以允许用户控制序列化的过程,比如可以在序列化的过程中动态改变序列化的数值。

    来看一下这两个方法的具体实现:

    private void readObject(java.io.ObjectInputStream s)
            throws java.io.IOException, ClassNotFoundException {
            elementData = EMPTY_ELEMENTDATA;
    
            // Read in size, and any hidden stuff
            s.defaultReadObject();
    
            // Read in capacity
            s.readInt(); // ignored
    
            if (size > 0) {
                // be like clone(), allocate array based upon size not capacity
                ensureCapacityInternal(size);
    
                Object[] a = elementData;
                // Read in all elements in the proper order.
                for (int i=0; i<size; i++) {
                    a[i] = s.readObject();
                }
            }
        }
    


    ​ private void writeObject(java.io.ObjectOutputStream s)
    ​ throws java.io.IOException{
    ​ // Write out element count, and any hidden stuff
    ​ int expectedModCount = modCount;
    ​ s.defaultWriteObject();

    ​ // Write out size as capacity for behavioural compatibility with clone()
    ​ s.writeInt(size);

            // Write out all elements in the proper order.
            for (int i=0; i<size; i++) {
                s.writeObject(elementData[i]);
            }
    
            if (modCount != expectedModCount) {
                throw new ConcurrentModificationException();
            }
        }
    

    那么为什么ArrayList要用这种方式来实现序列化呢?

    why transient
    ArrayList实际上是动态数组,每次在放满以后自动增长设定的长度值,如果数组自动增长长度设为100,而实际只放了一个元素,那就会序列化99个null元素。为了保证在序列化的时候不会将这么多null同时进行序列化,ArrayList把元素数组设置为transient。
    
    why writeObject and readObject
    前面说过,为了防止一个包含大量空对象的数组被序列化,为了优化存储,所以,ArrayList使用transient来声明elementData。 但是,作为一个集合,在序列化过程中还必须保证其中的元素可以被持久化下来,所以,通过重写writeObject 和 readObject方法的方式把其中的元素保留下来。
    
    writeObject方法把elementData数组中的元素遍历的保存到输出流(ObjectOutputStream)中。
    
    readObject方法从输入流(ObjectInputStream)中读出对象并保存赋值到elementData数组中。
    

    如何自定义的序列化和反序列化策略

    延续上一部分,刚刚我们明白了ArrayList序列化数组元素的原理。

    至此,我们先试着来回答刚刚提出的问题:

    如何自定义的序列化和反序列化策略

    答:可以通过在被序列化的类中增加writeObject 和 readObject方法。那么问题又来了:

    虽然ArrayList中写了writeObject 和 readObject 方法,但是这两个方法并没有显示的被调用啊。

    那么如果一个类中包含writeObject 和 readObject 方法,那么这两个方法是怎么被调用的呢?

    ObjectOutputStream
    从code 4中,我们可以看出,对象的序列化过程通过ObjectOutputStream和ObjectInputputStream来实现的,那么带着刚刚的问题,我们来分析一下ArrayList中的writeObject 和 readObject 方法到底是如何被调用的呢?

    为了节省篇幅,这里给出ObjectOutputStream的writeObject的调用栈:

    writeObject —> writeObject0 —>writeOrdinaryObject—>writeSerialData—>invokeWriteObject

    这里看一下invokeWriteObject:

    void invokeWriteObject(Object obj, ObjectOutputStream out)
            throws IOException, UnsupportedOperationException
        {
            if (writeObjectMethod != null) {
                try {
                    writeObjectMethod.invoke(obj, new Object[]{ out });
                } catch (InvocationTargetException ex) {
                    Throwable th = ex.getTargetException();
                    if (th instanceof IOException) {
                        throw (IOException) th;
                    } else {
                        throwMiscException(th);
                    }
                } catch (IllegalAccessException ex) {
                    // should not occur, as access checks have been suppressed
                    throw new InternalError(ex);
                }
            } else {
                throw new UnsupportedOperationException();
            }
        }
    

    其中writeObjectMethod.invoke(obj, new Object[]{ out });是关键,通过反射的方式调用writeObjectMethod方法。官方是这么解释这个writeObjectMethod的:

    class-defined writeObject method, or null if none

    在我们的例子中,这个方法就是我们在ArrayList中定义的writeObject方法。通过反射的方式被调用了。

    至此,我们先试着来回答刚刚提出的问题:

    如果一个类中包含writeObject 和 readObject 方法,那么这两个方法是怎么被调用的?
    
    答:在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法时,会通过反射的方式调用。
    

    为什么要实现Serializable

    至此,我们已经介绍完了ArrayList的序列化方式。那么,不知道有没有人提出这样的疑问:

    Serializable明明就是一个空的接口,它是怎么保证只有实现了该接口的方法才能进行序列化与反序列化的呢?

    Serializable接口的定义:
    
    public interface Serializable {
    }
    读者可以尝试把code 1中的继承Serializable的代码去掉,再执行code 2,会抛出java.io.NotSerializableException。
    

    其实这个问题也很好回答,我们再回到刚刚ObjectOutputStream的writeObject的调用栈:

    writeObject ---> writeObject0 --->writeOrdinaryObject--->writeSerialData--->invokeWriteObject
    

    writeObject0方法中有这么一段代码:

    if (obj instanceof String) {
                    writeString((String) obj, unshared);
                } else if (cl.isArray()) {
                    writeArray(obj, desc, unshared);
                } else if (obj instanceof Enum) {
                    writeEnum((Enum<?>) obj, desc, unshared);
                } else if (obj instanceof Serializable) {
                    writeOrdinaryObject(obj, desc, unshared);
                } else {
                    if (extendedDebugInfo) {
                        throw new NotSerializableException(
                            cl.getName() + "\n" + debugInfoStack.toString());
                    } else {
                        throw new NotSerializableException(cl.getName());
                    }
                }
    
    

    在进行序列化操作时,会判断要被序列化的类是否是Enum、Array和Serializable类型,如果不是则直接抛出NotSerializableException。

    序列化知识点总结

    1、如果一个类想被序列化,需要实现Serializable接口。否则将抛出NotSerializableException异常,这是因为,在序列化操作过程中会对类型进行检查,要求被序列化的类必须属于Enum、Array和Serializable类型其中的任何一种。

    2、通过ObjectOutputStream和ObjectInputStream对对象进行序列化及反序列化

    3、虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID)

    序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。那么随机生成的序列化 ID 有什么作用呢,有些时候,通过改变序列化 ID 可以用来限制某些用户的使用。

    4、序列化并不保存静态变量。

    5、要想将父类对象也序列化,就需要让父类也实现Serializable 接口。

    6、Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。

    7、服务器端给客户端发送序列化对象数据,对象中有一些数据是敏感的,比如密码字符串等,希望对该密码字段在序列化时,进行加密,而客户端如果拥有解密的密钥,只有在客户端进行反序列化时,才可以对密码进行读取,这样可以一定程度保证序列化对象的数据安全。

    8、在类中增加writeObject 和 readObject 方法可以实现自定义序列化策略

    参考文章

    https://blog.csdn.net/qq_34988624/article/details/86592229
    https://www.meiwen.com.cn/subject/slhvhqtx.html
    https://blog.csdn.net/qq_34988624/article/details/86592229
    https://segmentfault.com/a/1190000012220863
    https://my.oschina.net/wuxinshui/blog/1511484
    https://blog.csdn.net/hukailee/article/details/81107412

    微信公众号

    个人公众号:程序员黄小斜

    微信公众号【程序员黄小斜】新生代青年聚集地,程序员成长充电站。作者黄小斜,职业是阿里程序员,身份是斜杠青年,希望和更多的程序员交朋友,一起进步和成长!专注于分享技术、面试、职场等成长干货,这一次,我们一起出发。

    关注公众号后回复“2019”领取我这两年整理的学习资料,涵盖自学编程、求职面试、算法刷题、Java技术学习、计算机基础和考研等8000G资料合集。

    技术公众号:Java技术江湖

    微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,专注于 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!

    关注公众号后回复“PDF”即可领取200+页的《Java工程师面试指南》强烈推荐,几乎涵盖所有Java工程师必知必会的知识点。

    展开全文
  • 欺骗的艺术》有感

    千次阅读 2014-09-23 00:47:26
    阅读这本书的时候正值我厂IPO期间,刚好公司内部也在强调信息和数据安全的重要性,受这些因素的影响,我最近两个月也没有在外部博客上(主要是CSDN博客)写文章。接受完公司安全培训后,又阅读了该书,安全、防信息...

    上个月月底参加了CSDN的读书活动,选取了《反欺骗的艺术——世界传奇黑客的经历分享》一书。

    作者凯文米特尼克这个名称太吸引眼球了,而译者潘爱民老师同样是大名鼎鼎。

    阅读这本书的时候正值公司IPO期间,刚好公司内部也在强调信息和数据安全的重要性,受这些因素的影响,我最近两个月也没有在外部博客上(主要是CSDN博客)写文章。

    接受完公司安全培训后,又阅读了该书,安全、防信息泄露的意识更加深刻了,当时脑子里面自然而然浮出了这么个想法:这本书值得让公司发给每个员工一读。


    原著的标题是“The Art of Deception”,直译应该是“欺骗的艺术”,但实际上译作采用了“反欺骗的艺术”作为标题。毕竟“欺骗的艺术”稍显歧义,有“做坏事”的感觉,而“反欺骗的艺术”则显出正能量,说明从这本书中我们可以学习到如何降低被欺骗的概率、增加安全意识。

    那么,这本书增强我们的安全意识呢?

    书中通过一个个根据事实改编的故事来吸引读者,让人着迷。如果换一个标题来形容书中内容的话,可能“社会工程学案例分析”是个可以凑合的描述,但相比于原标题,则显得枯燥了许多,毕竟书中的一个个故事很是形象生动,引人入胜。


    阅读过程中,跟随者原著故事的精彩性,以及潘爱民老师翻译的功底,我脑子里面都会不自觉浮现出社会工程案例展开的画面。同时,内心也在时不时的问自己,如果换成是我,我会不会在这种场景下泄露书中对应的信息呢?答案是不确定的,有可能会,也有可能不会——因为我看了这本书,所以不会的概率更高了。

    看完之后,当涉及到一些工作相关的数据时,我会下意识地想:这些信息适合说出去吗?在很多场景下,我们不知不觉很容易讨论到一些敏感数据造成信息上的泄露。比如我上周刚遇到的,由于公司IPO备受瞩目,连运钞车的武装押运都跟我闲聊起来了,而且越聊越深。当对方问到一些比较敏感的数据时,我就会有意识的笑笑、礼貌结束会话,然后走开。

    当你无法确定一些信息是否可以交流时,最好不要交流。一种比较方便的确定方法是——你是否因为该工作岗位才了解了这些信息?如果是,请注意保密。


    展开全文
  • 爬虫与爬虫

    万次阅读 2018-01-29 12:57:52
    爬虫爬虫运行现状 真实世界的爬虫比例 哭笑不得的决策思路 爬虫爬虫技术现状 为python平反 无法绕开的误伤率 前端工程师的逆袭 误伤,还是误伤 爬虫爬虫套路...
  • 判断两个区间范围是否重复

    千次阅读 2016-09-21 23:42:45
    工作一年,工作中接触的大部分都是些基础知识。之前在系统中写过一判断区间是否重复的方法,当时写完后运行没问题,再到后来看《编写可代码的艺术》时,发现换角度思考还有更好的办法。
  • 采用渐进式rehash会导致字典中的数据分散在两个dictht中,因此对字典的操作也会在两个哈希表上进行。 例如查找时,先从ht[0]查找,没有再查找ht[1],添加时直接添加到ht[1]中。 常见操作 > hset hash-key sub-key1 ...
  • 月写了一系列文章《xcode汇编调试iOS模拟器程序》,是使用xcode来动态汇编分析iOS模拟器程序的。这系列则是静态分析,用到IDA来做汇编/编译。一些概念不会在此重复,遇到时可回xcode汇编系列。 ...
  • VxWorks的两个调试命令

    千次阅读 2007-09-05 09:20:00
    1.汇编命令l:用法:l Addr,Num功能:从Addr地址开始显示Num条汇编指令,如果不加Num则按照默认的方式显示10条汇编指令.举例:(1)不加Num按照默认的方式显示10条汇编指令:(2)加参数后显示指定行数的汇编指令:2....
  • 两个linux内核rootkit--之一:enyelkm

    千次阅读 2010-02-09 22:30:00
    首先,这rootkit其实是一内核木马,和大多数木马不同的是,恶意木马所在的机器是客户端而不是服务器,而黑客所在的机器是服务器,这样做的好处在于可以躲避防火墙,一般的防火墙对外出的包审查不是那么严格而对...
  • 个反混淆的小工具

    千次阅读 2007-05-08 16:12:00
    最近搞定了一C#编写的整站程序,学到了很多新知识,在这里整个过程分享给大家,并献上一款自制的小工具,作为见面礼。前几天一做私服的朋友让我研究一下某个私服整站系统,这系统用来实现游戏的部分功能及...
  • Android混淆编译、混淆、编译

    万次阅读 2016-08-12 21:29:36
    混淆编译为了保护APK代码和架构,不轻易被...由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易编译成Java 源代码。
  • 目录 前言 一、爬虫爬虫运行现状 1、真实世界的爬虫比例 2、哭笑不得的决策思路 二、爬虫爬虫技术现状 ...三、爬虫爬虫套路现状 ...爬虫与爬虫,是一很不阳光的行业。 这里说的不阳...
  • 《活着》后感4500

    千次阅读 2019-03-08 00:13:01
    《活着》后感4500: 听说张艺谋在转型拍商业电影前,拍过一部电影《活着》,被誉为是他拍得最好的电影。想看已经有大半年了,却一直没看。年底有空,想培养一下“艺术细胞”去学习下,看了下电影内容简介,好像...
  • war包编译成整个java项目

    万次阅读 2018-10-19 16:06:40
    1、目的:别人不愿意给你源代码,所以给你了一份编译好的class文件或者是一导出的jar包或者war包。...但是像Java、.net这样基于虚拟机技术的编程语言则编译非常容易,Java平台下有Jad、Jode、JD等编译...
  • Android应用逆向——分析编译代码之大神器

    万次阅读 多人点赞 2016-07-25 21:18:24
    如果说使用dex2jar和JD-GUI获得了一APP编译后的JAVA代码,再结合smali代码调试器来进行调试还不够爽,不够畅快的话,下面将介绍一帮助分析代码执行流程的大神器。这神器优点很多,不过遗憾的是它有一致命...
  • 在这cache everywhere的时代,在这人人都会说分布式缓存的时代,Memcached几乎已成为网站开发中的标配。 作为一名普通的coder,我们在编写缓存代码的时候,很多情况下可能都只是了解其基本原理,知道如何调用...
  • 容易理解的对卷积(convolution)的解释

    万次阅读 多人点赞 2017-01-25 15:14:49
    啰嗦开场白本科期间,信号与系统里面经常讲到卷积(convolution),自动控制原理里面也会经常有提到卷积。硕士期间又学了线性系统理论与数字信号处理,里面也是各种大卷积的概念。至于最近大火的深度学习,更...
  • 欺诈概念库-信用卡欺诈管理

    千次阅读 2018-08-30 10:25:03
    尽管我国只有数千信用卡账户数据资料受波及,但一石激起千层浪,国内金融管理机构、各银行、信用卡持卡人等在采取应急措施避免损失的同时,对于信用卡的安全性、信用卡的欺诈管理等也给予了高度的关注。...
  • 爱是什么——弗洛姆《爱的艺术》的后感作文3000: 看这本《爱的艺术》后,又震惊又清醒,有一种原来是这样的豁然之感。爱不是一种选择,而是一种能力。通过阅读弗洛姆的《爱的艺术》,我知道了,原来我对爱的...
  • 前不久华为发布Dorado V3全闪存产品,很多专业媒体和自媒体对该产品进行了全方位报道,听闻该产品采用了很...今天我就近期所学进行总结并分享给大家,通过技术和产品分析,让大家对Dorado V3及全闪产品也有深入了解。
  • 这里说的不阳光,有两个含义。第一是,这个行业是隐藏在地下的,一般很少被曝光出来。很多公司对外都不会宣称自己有爬虫团队,甚至隐瞒自己有爬虫团队的事实。这可能是出于公司战略角度来看的,与技术无关。第二是...
  • 静态汇编技术

    千次阅读 2008-07-14 16:55:00
    静态汇编技术的原理其实非常简单,主要弄清除汇编程序的原理,就可以创作出多ANTI-汇编的方法。由于这技术没有固定的技术形势,如何怎么样全靠你自己的想象力了。这里就介绍一下原理方面和几常见...
  • 功能取决于需求,在实现这功能之前,却有一小小的插曲,有同学...下面就看看unity在windows平台中防编译加密dll的实现步骤吧,unity在打包后,会将所有的代码打进一Assembly-CSharp.dll的文件里面,通过这文件
  • 推荐几比较容易中的EI源刊

    万次阅读 多人点赞 2018-12-04 15:13:37
    另外,每个杂志都有他们的具体格式要求,一定要按照他们的要求论文写好,免得浪费时间,前些时候,我的一个同事向一个著名的英文杂志投稿,由于格式问题,人家过两个星期就退回来了,而且说了很多难听的话,说投稿...
  • unity防编译 windows平台加密dll

    千次阅读 2017-04-08 15:50:54
    功能取决于需求,在实现这功能之前,却有一小小的插曲,有同学认为,并不需要去实现游戏加密,再怎样也会被破解,何必浪费精力。虽然这样说,但是我们所做的加密至少也会增加一点破解成本,不会让我们辛苦写的代码...
  • Android中序列化与序列化

    千次阅读 2018-06-15 17:26:46
    这几天在看到设计模式时,看到有关于序列化的知识,发现自己之前这块知识很欠缺,所以这花了天仔细研究了一下,感觉这东西还是很有趣的(当然也很有用-。+),今天给大家带来这篇文章,希望对大家有帮助。序列化...
  • 那些你不知道的爬虫爬虫套路

    千次阅读 多人点赞 2017-06-02 09:28:19
    这里说的不阳光,有两个含义。第一是,这个行业是隐藏在地下的,一般很少被曝光出来。很多公司对外都不会宣称自己有爬虫团队,甚至隐瞒自己有爬虫团队的事实。这可能是出于公司战略角度来看的,与技术无关。第二是...
  • 《钢铁是怎样炼成的》的后感作文5000: 《钢铁是怎样炼成的》出版于1934年,号称影响一代人还是代人,不记得了。对于天天说要影响我一辈子的,我向来都不感冒。上学时要求这本书,始终很抗拒。我不是天天哭...
  • Java 那些你不知道的爬虫爬虫套路

    千次阅读 多人点赞 2018-08-16 18:40:33
    这里说的不阳光,有两个含义。 第一是,这个行业是隐藏在地下的,一般很少被曝光出来。很多公司对外都不会宣称自己有爬虫团队,甚至隐瞒自己有爬虫团队的事实。这可能是出于公司战略角度来看的,与技术无关。 第...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,201
精华内容 43,280
关键字:

容易把两个字读反