ÓÑÇéÌáʾ£ºÈç¹û±¾ÍøÒ³´ò¿ªÌ«Âý»òÏÔʾ²»ÍêÕû£¬Çë³¢ÊÔÊó±êÓÒ¼ü¡°Ë¢Ð¡±±¾ÍøÒ³£¡
¸»Ê¿¿µÐ¡ËµÍø ·µ»Ø±¾ÊéĿ¼ ¼ÓÈëÊéÇ© ÎÒµÄÊé¼Ü ÎÒµÄÊéÇ© TXTÈ«±¾ÏÂÔØ ¡ºÊղص½ÎÒµÄä¯ÀÀÆ÷¡»

VB2008´ÓÈëÃŵ½¾«Í¨(PDF¸ñʽӢÎÄ°æ)-µÚ53²¿·Ö

¿ì½Ý²Ù×÷: °´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·­Ò³ °´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ °´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿! Èç¹û±¾ÊéûÓÐÔĶÁÍ꣬ÏëÏ´μÌÐø½Ó×ÅÔĶÁ£¬¿ÉʹÓÃÉÏ·½ "Êղص½ÎÒµÄä¯ÀÀÆ÷" ¹¦ÄÜ ºÍ "¼ÓÈëÊéÇ©" ¹¦ÄÜ£¡



ticket¡£¡¡¡¡



Converting¡¡a¡¡Binary¡¡Stream¡¡into¡¡a¡¡Text¡¡Stream¡¡



Converting¡¡a¡¡binary¡¡stream¡¡into¡¡a¡¡text¡¡stream¡¡involves¡¡using¡¡the¡¡¡­provided¡¡formatter¡¡to¡¡¡¡

create¡¡a¡¡Ticket¡¡instance¡¡that¡¡is¡¡then¡¡converted¡¡into¡¡text¡£¡¡The¡¡following¡¡is¡¡the¡¡plete¡¡source¡¡¡¡

code¡¡£¨you¡¯ll¡¡need¡¡a¡¡reference¡¡to¡¡¡¡LottoLibrary¡¡in¡¡¡¡Binary2Text£©¡£¡¡



Imports¡¡System¡£IO¡¡

Imports¡¡System¡£Runtime¡£Serialization¡£Formatters¡£Binary¡¡



Public¡¡Class¡¡LottoTicketProcessor¡¡£º¡¡Implements¡¡IBinary2TextProcessor¡¡

¡¡¡¡¡¡¡¡Public¡¡Sub¡¡Process£¨ByVal¡¡input¡¡As¡¡Stream£»¡¡ByVal¡¡output¡¡As¡¡TextWriter£©¡¡_¡¡

¡¡¡¡¡¡¡¡¡¡¡¡Implements¡¡IBinary2TextProcessor¡£Process¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡builder¡¡As¡¡StringBuilder¡¡=¡¡New¡¡StringBuilder£¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Try¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Do¡¡While¡¡True¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡formatter¡¡As¡¡BinaryFormatter¡¡=¡¡New¡¡BinaryFormatter£¨£©¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡ticket¡¡As¡¡LottoLibrary¡£Ticket¡¡=¡¡_¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡DirectCast£¨formatter¡£Deserialize£¨input£©£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡LottoLibrary¡£Ticket£©¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡298¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

276¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡TE¡¡N¡¡CE¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡builder¡£AppendFormat£¨¡¡_¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¨£û0£ý¡££û1£ý¡££û2£ý¡¡£û3£ý¡¡£û4£ý¡¡£û5£ý¡¡£û6£ý¡¡£û7£ý¡¡£û8£ý¡¡£û9£ý¡¡£û10£ý¡¨£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£DrawDate¡£Year£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£DrawDate¡£Month£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£DrawDate¡£Day£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£Numbers£¨0£©£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£Numbers£¨1£©£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£Numbers£¨2£©£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£Numbers£¨3£©£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£Numbers£¨4£©£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£Numbers£¨5£©£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ticket¡£Bonus£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ControlChars¡£NewLine£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Loop¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Catch¡¡e¡¡As¡¡Exception¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Try¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡output¡£Write£¨builder¡£ToString£¨£©£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡code£»¡¡a¡¡binary¡¡stream¡¡is¡¡read¡¡using¡¡the¡¡BinaryFormatter¡¡class£»¡¡which¡¡reads¡¡the¡¡data¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡for¡¡an¡¡object¡¡from¡¡the¡¡data¡¡stream¡£¡¡Notice¡¡how¡¡the¡¡method¡¡Deserialize£¨£©¡¡does¡¡not¡¡ask¡¡which¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡type¡¡to¡¡read¡£¡¡This¡¡is¡¡because¡¡all¡¡of¡¡that¡¡information¡¡is¡¡saved¡¡in¡¡the¡¡stream¡£¡¡Deserialize£¨£©¡¡will¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡read¡¡data¡¡from¡¡the¡¡stream£»¡¡associate¡¡the¡¡data¡¡with¡¡a¡¡type£»¡¡instantiate¡¡it£»¡¡and¡¡populate¡¡the¡¡data¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡members¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡bolded¡¡code¡¡in¡¡the¡¡preceding¡¡listing¡¡points¡¡out¡¡where¡¡deserialization¡¡bees¡¡tricky£»¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡which¡¡centers¡¡around¡¡when¡¡to¡¡read¡¡what¡¡type¡£¡¡A¡¡binary¡¡stream¡¡when¡¡processed¡¡by¡¡the¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡BinaryFormatter¡¡will¡¡read¡¡and¡¡write¡¡objects¡£¡¡BinaryFormatter¡¡will¡¡instantiate¡¡whatever¡¡it¡¡encoun

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ters¡¡and¡¡assumes¡¡that¡¡the¡¡caller¡¡of¡¡BinaryFormatter¡¡knows¡¡which¡¡type¡¡is¡¡being¡¡manipulated¡£¡¡If¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡caller¡¡does¡¡not¡¡know¡¡this£»¡¡an¡¡exception¡¡will¡¡occur¡¡because¡¡the¡¡type¡¡cast¡¡to¡¡the¡¡specific¡¡type¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡will¡¡fail¡£¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡exception¡¡block¡¡is¡¡necessary¡¡because¡¡you¡¡don¡¯t¡¡know¡¡how¡¡many¡¡Ticket¡¡objects¡¡have¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡been¡¡saved£»¡¡as¡¡the¡¡count¡¡has¡¡not¡¡been¡¡saved¡¡to¡¡the¡¡stream¡£¡¡¡¡provides¡¡the¡¡Position¡¡and¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Length¡¡properties¡¡to¡¡determine¡¡if¡¡any¡¡instances¡¡are¡¡left¡¡to¡¡be¡¡read£»¡¡but¡¡those¡¡properties¡¡work¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡only¡¡with¡¡files¡£¡¡If¡¡the¡¡binary¡¡stream¡¡being¡¡read¡¡is¡¡a¡¡console¡¡data¡¡stream£»¡¡there¡¡is¡¡no¡¡length¡¡or¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡position¡£¡¡Thus£»¡¡the¡¡only¡¡real¡¡solution¡¡is¡¡to¡¡keep¡¡reading¡¡until¡¡you¡¡can¡¯t¡¡do¡¡so¡¡anymore¡¡and¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡assume¡¡processing¡¡is¡¡plete¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡INTENTION¡¡AND¡¡IMPLEMENTATION¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡fact¡¡that¡¡¡¡Position¡¡and¡¡¡¡Length¡¡have¡¡different¡¡behaviors¡¡depending¡¡on¡¡the¡¡implementation¡¡might¡¡seem¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡to¡¡break¡¡the¡¡contract¡¡of¡¡being¡¡able¡¡to¡¡separate¡¡intention¡¡from¡¡implementation¡£¡¡It¡¡seems¡¡to¡¡break¡¡the¡¡po

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡nent¡¡software¡¡paradigm¡¡because£»¡¡as¡¡a¡¡developer£»¡¡you¡¡do¡¡need¡¡to¡¡know¡¡about¡¡the¡¡stream¡¡implementation¡£¡¡The¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡rule¡¡has¡¡not¡¡been¡¡broken£»¡¡but¡¡been¡¡put¡¡on¡¡hold£»¡¡because¡¡sometimes¡¡you¡¡are¡¡left¡¡with¡¡no¡¡other¡¡option¡£¡¡A¡¡file¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡stream¡¡and¡¡console¡¡stream¡¡share¡¡many¡¡characteristics£»¡¡but¡¡knowing¡¡the¡¡length¡¡is¡¡not¡¡one¡¡of¡¡them¡£¡¡A¡¡programmer¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡could¡¡force¡¡the¡¡console¡¡stream¡¡to¡¡give¡¡back¡¡some¡¡value£»¡¡but¡¡that¡¡would¡¡be¡¡incorrect¡£¡¡The¡¡smarter¡¡approach£»¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡and¡¡the¡¡one¡¡chosen¡¡by¡¡the¡¡¡¡implementers£»¡¡is¡¡to¡¡generate¡¡an¡¡exception¡£¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡299¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡A¡¡PT¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡T¡¡E¡¡N¡¡CE¡¡277¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡binary¡¡stream¡¡formatter¡¡can¡¡bee¡¡even¡¡pickier¡£¡¡Look¡¡at¡¡Figure¡¡10¡­8¡¡again¡¡and¡¡notice¡¡how¡¡the¡¡¡¡

¡¡¡¡¡¡type¡¡information¡¡with¡¡version¡¡identifiers¡¡is¡¡stored¡¡in¡¡the¡¡stream¡£¡¡Imagine¡¡the¡¡situation¡¡where¡¡you¡¡create¡¡an¡¡¡¡

¡¡¡¡¡¡assembly¡¡that¡¡saves¡¡some¡¡objects¡£¡¡Then¡¡x¡¡years¡¡and¡¡n¡¡versions¡¡of¡¡the¡¡program¡¡later£»¡¡you¡¡try¡¡to¡¡load¡¡the¡¡file¡£¡¡¡¡

¡¡¡¡¡¡You¡¡can¡¯t£»¡¡because¡¡the¡¡version¡¡of¡¡the¡¡type¡¡does¡¡not¡¡exist¡£¡¡It¡¡is¡¡smart¡¡for¡¡the¡¡binary¡¡formatter¡¡to¡¡not¡¡instantiate¡¡¡¡

¡¡¡¡¡¡a¡¡version¡¡of¡¡a¡¡type¡¡that¡¡does¡¡not¡¡exist£»¡¡because¡¡otherwise¡¡there¡¡could¡¡be¡¡serialization¡¡failures¡£¡¡



Tweaking¡¡Serialization¡¡



When¡¡dealing¡¡with¡¡serialization£»¡¡you¡¡may¡¡e¡¡across¡¡a¡¡particular¡¡text¡¡or¡¡binary¡¡format¡¡that¡¡¡¡

will¡¡require¡¡some¡¡extra¡¡work¡£¡¡Also£»¡¡you¡¡may¡¡have¡¡some¡¡objects¡¡that¡¡you¡¡want¡¡to¡¡exclude¡¡from¡¡¡¡

serialization¡£¡¡



Performing¡¡Custom¡¡Serialization¡¡



Sometimes¡¡I¡¡think¡¡there¡¡are¡¡as¡¡many¡¡file¡¡formats¡¡as¡¡there¡¡are¡¡grains¡¡of¡¡sand¡¡on¡¡a¡¡beach¡£¡¡As¡¡just¡¡¡¡

two¡¡examples£»¡¡specializations¡¡of¡¡text¡¡formats¡¡are¡¡XML¡¡and¡¡JSON¡¡£¨for¡¡JavaScript¡¡Object¡¡Notation£»¡¡¡¡

used¡¡in¡¡JavaScript¡¡for¡¡your¡¡web¡¡browser£©¡£¡¡In¡¡most¡¡cases£»¡¡the¡¡default¡¡serializations¡¡will¡¡work¡£¡¡¡¡

However£»¡¡you¡¡may¡¡need¡¡to¡¡tweak¡¡a¡¡particular¡¡serialization¡£¡¡

¡¡¡¡¡¡¡¡¡¡Many¡¡serialization¡¡techniques¡¡allow¡¡custom¡¡serializations¡¡of¡¡a¡¡particular¡¡object¡£¡¡The¡¡default¡¡¡¡

serialization¡¡implies¡¡a¡¡certain¡¡marshaling¡£¡¡For¡¡example£»¡¡it¡¡might¡¡mean¡¡an¡¡integer¡¡will¡¡be¡¡marshaled¡¡¡¡

as¡¡an¡¡integer¡¡in¡¡another¡¡representation¡¡£¨in¡¡SQL¡¡Server£»¡¡for¡¡example£©¡£¡¡Sometimes£»¡¡however£»¡¡you¡¡¡¡

might¡¡want¡¡different¡¡representations¡¡in¡¡different¡¡streams¡£¡¡In¡¡that¡¡case£»¡¡you¡¡need¡¡to¡¡implement¡¡¡¡

the¡¡marshaling¡¡of¡¡the¡¡data¡¡member¡¡yourself¡£¡¡With¡¡most¡¡serialization¡¡platforms£»¡¡it¡¡means¡¡imple

menting¡¡a¡¡particular¡¡interface¡£¡¡

¡¡¡¡¡¡¡¡¡¡Following¡¡is¡¡an¡¡example¡¡that¡¡performs¡¡a¡¡custom¡¡serialization¡¡for¡¡a¡¡¡¡binary¡¡stream¡£¡¡



Imports¡¡System¡£Runtime¡£Serialization¡¡



¡¡_¡¡

Class¡¡MyObject¡¡

¡¡¡¡¡¡¡¡Implements¡¡ISerializable¡¡

¡¡¡¡¡¡¡¡Private¡¡value¡¡As¡¡Integer¡¡



¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨£©¡¡

¡¡¡¡¡¡¡¡End¡¡Sub¡¡



¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨ByVal¡¡info¡¡As¡¡SerializationInfo£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ByVal¡¡context¡¡As¡¡StreamingContext£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡value¡¡=¡¡Integer¡£Parse£¨CStr£¨info¡£GetValue£¨¡¨value¡¨£»¡¡GetType£¨String£©£©£©£©¡¡

¡¡¡¡¡¡¡¡End¡¡Sub¡¡



¡¡¡¡¡¡¡¡Public¡¡Sub¡¡GetObjectData£¨ByVal¡¡info¡¡As¡¡SerializationInfo£»¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ByVal¡¡context¡¡As¡¡StreamingContext£©¡¡

¡¡¡¡¡¡¡¡Implements¡¡ISerializable¡£GetObjectData¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡info¡£AddValue£¨¡¨value¡¨£»¡¡value¡£ToString£¨£©£©¡¡

¡¡¡¡¡¡¡¡End¡¡Sub¡¡

End¡¡Class¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡300¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

278¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡TE¡¡N¡¡CE¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡example£»¡¡the¡¡interface¡¡System¡£Runtime¡£Serialization¡£ISerializable¡¡is¡¡implemented¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡This¡¡means¡¡when¡¡BinaryFormatter¡¡serializes¡¡or¡¡deserializes¡¡MyObject£»¡¡BinaryFormatter¡¡will¡¡not¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡manipulate¡¡the¡¡binary¡¡stream£»¡¡but¡¡delegate¡¡the¡¡manipulation¡¡to¡¡MyObject¡£¡¡With¡¡many¡¡serializa

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡tion¡¡platforms£»¡¡there¡¡is¡¡an¡¡explicit¡¡method£»¡¡property£»¡¡or¡¡flag¡¡to¡¡indicate¡¡whether¡¡MyObject¡¡is¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡being¡¡written¡¡to¡¡the¡¡stream¡¡or¡¡read¡¡from¡¡the¡¡stream¡£¡¡In¡¡the¡¡case¡¡of¡¡binary¡¡serialization£»¡¡when¡¡an¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡object¡¡is¡¡written¡¡to¡¡the¡¡stream£»¡¡the¡¡GetObjectData£¨£©¡¡method¡¡is¡¡called£»¡¡and¡¡when¡¡the¡¡object¡¡is¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡being¡¡read¡¡from¡¡the¡¡stream£»¡¡the¡¡constructor¡¡is¡¡called¡£¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Serialization¡¡involves¡¡two¡¡directions£»¡¡and¡¡a¡¡developer¡¡must¡¡implement¡¡both£»¡¡in¡¡the¡¡same¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡way¡£¡¡In¡¡the¡¡example£»¡¡the¡¡AddValue£¨£©¡¡method¡¡is¡¡called£»¡¡indicating¡¡that¡¡the¡¡data¡¡member¡¡is¡¡written¡¡as¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡string£»¡¡and¡¡when¡¡reading£»¡¡the¡¡value¡¡data¡¡member¡¡must¡¡be¡¡read¡¡as¡¡a¡¡string¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡öNote¡¡¡¡One¡¡of¡¡the¡¡biggest¡¡challenges¡¡with¡¡serialization¡¡is¡¡that¡¡each¡¡and¡¡every¡¡serialization¡¡platform¡¡seems¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡to¡¡have¡¡its¡¡own¡¡way¡¡of¡¡doing¡¡things¡£¡¡Sometimes¡¡there¡¡will¡¡be¡¡mon¡¡methods¡¡and¡¡attributes£»¡¡but¡¡other¡¡times¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡they¡¡will¡¡not¡¡exist¡£¡¡A¡¡universal¡¡approach¡¡to¡¡serialization¡¡won¡¯t¡¡work¡£¡¡You¡¡should¡¡avoid¡¡performing¡¡custom¡¡seri

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡alization¡¡whenever¡¡possible¡£¡¡Most¡¡serialization¡¡platforms¡¡are¡¡smart¡¡enough¡¡to¡¡know¡¡what¡¡to¡¡do¡¡with¡¡each¡¡data¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡member¡£¡¡So¡¡the¡¡best¡¡approach¡¡is¡¡to¡¡let¡¡the¡¡platform¡¡figure¡¡things¡¡out¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Declaring¡¡a¡¡Data¡¡Member¡¡As¡¡Nonserializable¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡example¡¡of¡¡the¡¡Ticket¡¡type£»¡¡all¡¡of¡¡the¡¡data¡¡members¡¡were¡¡serialized¡£¡¡However£»¡¡some

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡times¡¡that¡¡is¡¡not¡¡desired¡£¡¡Suppose¡¡an¡¡object¡¡that¡¡you¡¡want¡¡to¡¡serialize¡¡has¡¡a¡¡network¡¡connection¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡or¡¡some¡¡other¡¡data¡¡value¡¡that¡¡will¡¡not¡¡make¡¡any¡¡sense¡¡if¡¡the¡¡object¡¡is¡¡serialized¡¡and¡¡then¡¡dese

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡rialized¡¡some¡¡time¡¡later¡£¡¡When¡¡the¡¡object¡¡is¡¡serialized£»¡¡the¡¡network¡¡connection¡¡will¡¡also¡¡be¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡serialized£»¡¡which¡¡is¡¡not¡¡appropriate¡£¡¡It¡¡is¡¡not¡¡appropriate¡¡to¡¡serialize¡¡a¡¡network¡¡connection¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡because¡¡that¡¡object¡¡is¡¡transient¡¡and¡¡applies¡¡only¡¡to¡¡the¡¡context¡¡of¡¡the¡¡object¡¡instance¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡To¡¡mark¡¡a¡¡data¡¡member¡¡as¡¡nonserializable£»¡¡attributes¡¡are¡¡often¡¡used£»¡¡as¡¡in¡¡the¡¡following¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡example¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Class¡¡MyObject2¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Private¡¡_networkIdentifier¡¡As¡¡Integer¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡example£»¡¡_networkIdentifier¡¡will¡¡not¡¡be¡¡written¡¡or¡¡read¡¡from¡¡the¡¡data¡¡stream¡£¡¡¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Separating¡¡Data¡¡Objects¡¡from¡¡Action¡¡Objects¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Another¡¡approach¡¡is¡¡to¡¡develop¡¡a¡¡number¡¡of¡¡data¡¡objects¡¡whose¡¡only¡¡role¡¡is¡¡to¡¡be¡¡used¡¡in¡¡seri

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡alization¡¡and¡¡data¡¡referencing¡£¡¡Such¡¡an¡¡approach¡¡is¡¡useful¡¡when¡¡using¡¡binary¡¡serialization£»¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡because¡¡you¡¡are¡¡then¡¡able¡¡to¡¡more¡¡effectively¡¡manage¡¡the¡¡version¡¡problem¡£¡¡The¡¡following¡¡is¡¡an¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡example¡¡of¡¡how¡¡such¡¡an¡¡architecture¡¡would¡¡be¡¡realized¡£¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡301¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡A¡¡PT¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡T¡¡E¡¡N¡¡CE¡¡279¡¡



¡¡

Class¡¡MyObject2¡¡

End¡¡Class¡¡



Class¡¡Doer¡¡

¡¡¡¡¡¡¡¡Private¡¡_object¡¡As¡¡MyObject2¡¡

¡¡¡¡¡¡¡¡Private¡¡_networkIdentifier¡¡As¡¡Integer¡¡

End¡¡Class¡¡



¡¡¡¡¡¡¡¡¡¡The¡¡class¡¡Doer¡¡has¡¡no¡¡serialization¡¡attribute¡¡and¡¡will¡¡not¡¡be¡¡serialized£»¡¡but¡¡it¡¡references¡¡¡¡

MyObject2¡£¡¡The¡¡network¡¡identifier¡¡data¡¡member¡¡has¡¡been¡¡moved¡¡from¡¡MyObject2¡¡to¡¡Doer¡£¡¡The¡¡¡¡

result¡¡is¡¡that¡¡MyObject2¡¡contains¡¡nothing¡¡that¡¡is¡¡transient¡£¡¡



pleting¡¡Custom¡¡Types¡¡



When¡¡writing¡¡custom¡¡types£»¡¡two¡¡methods¡¡are¡¡often¡¡implemented£»¡¡especially¡¡where¡¡objects¡¡are¡¡¡¡

to¡¡be¡¡pared¡¡a¡¡lot£º¡¡¡¡Equals£¨£©¡¡and¡¡GetHashCode£¨£©¡£¡¡These¡¡two¡¡methods¡¡are¡¡used¡¡by¡¡the¡¡¡¡¡¡

library¡¡API¡¡when¡¡paring¡¡and¡¡manipulating¡¡instances¡¡in¡¡a¡¡list¡¡or¡¡a¡¡collection¡£¡¡It¡¡just¡¡happened¡¡¡¡

in¡¡this¡¡chapter¡¯s¡¡example¡¡that¡¡a¡¡list¡¡of¡¡string¡¡types¡¡did¡¡the¡¡right¡¡thing¡£¡¡If¡¡TextProcessor¡¡had¡¡used¡¡¡¡

the¡¡Ticket¡¡type£»¡¡then¡¡the¡¡Equals£¨£©¡¡method¡¡of¡¡the¡¡list¡¡used¡¡to¡¡find¡¡date¡¡duplicates¡¡would¡¡not¡¡have¡¡¡¡

worked¡£¡¡The¡¡default¡¡implementations¡¡of¡¡¡¡Equals£¨£©¡¡and¡¡GetHashCode£¨£©¡¡are¡¡not¡¡implemented¡¡¡¡

properly¡£¡¡This¡¡is¡¡not¡¡the¡¡¡¡API¡¯s¡¡fault¡£¡¡Rather£»¡¡it¡¡is¡¡a¡¡recognition¡¡that¡¡Microsoft¡¡cannot¡¡know¡¡¡¡

the¡¡structure¡¡of¡¡an¡¡object¡¡and¡¡what¡¡is¡¡considered¡¡as¡¡making¡¡a¡¡type¡¡unique¡£¡¡



Implementing¡¡GetHashCode£¨£©¡¡



The¡¡MSDN¡¡documentation¡¡for¡¡Object¡£GetHashCode¡¡defines¡¡the¡¡GetHashCode£¨£©¡¡method¡¡as¡¡follows¡¡¡¡

£¨http£º//msdn2¡£microsoft¡£/en¡­us/library/system¡£object¡£gethashcode£¨VS¡£90£©¡£aspx£©£º¡¡



¡¡¡¡¡¡¡¡¡¡¡¡The¡¡GetHashCode¡¡method¡¡can¡¡be¡¡overridden¡¡by¡¡a¡¡derived¡¡type¡£¡¡Value¡¡types¡¡must¡¡over

¡¡¡¡¡¡¡¡¡¡¡¡ride¡¡this¡¡¡¡method¡¡to¡¡¡¡provide¡¡¡¡a¡¡¡¡hash¡¡¡¡function¡¡¡¡that¡¡¡¡is¡¡¡¡appropriate¡¡¡¡for¡¡that¡¡type¡¡¡¡and¡¡to¡¡

¡¡¡¡¡¡¡¡¡¡provide¡¡a¡¡useful¡¡distribution¡¡in¡¡¡¡a¡¡hash¡¡table¡£¡¡For¡¡¡¡best¡¡results£»¡¡the¡¡hash¡¡code¡¡must¡¡be¡¡

¡¡¡¡¡¡¡¡¡¡based¡¡on¡¡the¡¡value¡¡of¡¡an¡¡instance¡¡field¡¡or¡¡property¡¡instead¡¡of¡¡a¡¡static¡¡field¡¡or¡¡property¡£¡¡¡¡



¡¡¡¡¡¡¡¡¡¡¡¡Objects¡¡used¡¡as¡¡a¡¡key¡¡in¡¡a¡¡Hashtable¡¡object¡¡must¡¡also¡¡override¡¡the¡¡GetHashCode¡¡method¡¡

¡¡¡¡¡¡¡¡¡¡because¡¡those¡¡objects¡¡must¡¡generate¡¡their¡¡own¡¡hash¡¡code¡£¡¡If¡¡an¡¡object¡¡used¡¡as¡¡a¡¡key¡¡does¡¡

¡¡¡¡¡¡¡¡¡¡¡¡not¡¡¡¡provide¡¡¡¡a¡¡¡¡useful¡¡¡¡implementation¡¡¡¡of¡¡¡¡GetHashCode£»¡¡¡¡you¡¡¡¡can¡¡¡¡specify¡¡¡¡a¡¡¡¡hash¡¡¡¡code¡¡

¡¡¡¡¡¡¡¡¡¡provider¡¡when¡¡the¡¡Hashtable¡¡object¡¡is¡¡constructed¡£¡¡



¡¡¡¡¡¡¡¡¡¡But¡¡what¡¡does¡¡this¡¡actually¡¡mean£¿¡¡The¡¡purpose¡¡of¡¡GetHashCode£¨£©¡¡is¡¡to¡¡identify¡¡the¡¡object¡¡in¡¡¡¡

a¡¡collection¡¡of¡¡other¡¡objects¡¡using¡¡a¡¡hash¡¡code¡£¡¡Imagine¡¡creating¡¡a¡¡table¡¡of¡¡same¡­type¡¡instances¡£¡¡¡¡

The¡¡situation¡¡occurs¡¡when¡¡you¡¡create¡¡a¡¡collection¡¡and¡¡store¡¡a¡¡bunch¡¡of¡¡instances¡¡in¡¡the¡¡collec

tion¡£¡¡With¡¡the¡¡GetHashCode£¨£©¡¡method£»¡¡you¡¡can¡¡generally¡¡separate¡¡each¡¡instance¡¡from¡¡each¡¡other¡£¡¡¡¡

I¡¡say¡¡¡°generally¡±¡¡because¡¡GetHashCode£¨£©¡¡is¡¡an¡¡approximation¡£¡¡To¡¡verify¡¡if¡¡one¡¡object¡¡instance¡¡¡¡

equals¡¡another£»¡¡the¡¡Equals£¨£©¡¡method¡¡needs¡¡to¡¡be¡¡implemented¡£¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡302¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

280¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡TE¡¡N¡¡CE¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Implementing¡¡a¡¡hash¡¡code¡¡is¡¡best¡¡delegated¡¡to¡¡a¡¡helper¡¡class¡¡that¡¡does¡¡the¡¡heavy¡¡lifting¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡book¡¡Effective¡¡Java¡¡Programming¡¡Language¡¡Guide¡¡by¡¡Joshua¡¡Bloch¡¡£¨Prentice¡­Hall£»¡¡2001£©¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡outlines¡¡a¡¡robust¡¡technique¡£¡¡Basically£»¡¡you¡¡store¡¡some¡¡constant¡¡nonzero¡¡value£»¡¡such¡¡as¡¡17£»¡¡in¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡variable¡£¡¡Then£»¡¡for¡¡each¡¡data¡¡member¡¡of¡¡the¡¡type£»¡¡perform¡¡a¡¡mathematical¡¡operation¡¡that¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡results¡¡in¡¡Integer¡¡values¡¡that¡¡are¡¡successively¡¡multiplied¡¡and¡¡added£»¡¡where¡¡the¡¡operation¡¡is¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡specific¡¡to¡¡the¡¡type¡¡and¡¡defined¡¡as¡¡follows£º¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡Boolean£º¡¡If¡¡true¡¡return¡¡0£»¡¡otherwise¡¡return¡¡1¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡Byte£»¡¡Char£»¡¡Short£»¡¡or¡¡Integer£º¡¡Return¡¡the¡¡value¡¡of¡¡the¡¡type¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡Long£º¡¡Return¡¡CInt£¨value¡¡Xor¡¡£¨value¡¡¡·¡·¡¡&H20£©£©¡£¡¡&H20¡¡is¡¡the¡¡hexadecimal¡¡for¡¡32¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Single£º¡¡Return¡¡Convert¡£ToInt32¡¡of¡¡the¡¡value¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Object£º¡¡Return¡¡the¡¡value¡¡generated¡¡by¡¡calling¡¡Object¡£GetHashCode£¨£©¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡Array¡¡£º¡¡Iterate¡¡and¡¡treat¡¡each¡¡element¡¡individually¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡rules¡¡are¡¡implemented¡¡in¡¡a¡¡class¡¡called¡¡HashCodeAutomater¡£¡¡The¡¡following¡¡source¡¡code¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡is¡¡an¡¡implementation¡¡in¡¡an¡¡abbreviated¡¡form£º¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Class¡¡HashCodeAutomater¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Private¡¡Readonly¡¡_constant¡¡As¡¡Integer¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Private¡¡_runningTotal¡¡As¡¡Integer¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_constant¡¡=¡¡&H25¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_runningTot
·µ»ØĿ¼ ÉÏÒ»Ò³ ÏÂÒ»Ò³ »Øµ½¶¥²¿ ÔÞ£¨11£© ²È£¨11£©
¿ì½Ý²Ù×÷: °´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·­Ò³ °´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ °´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿!
ÎÂÜ°Ìáʾ£º ο´Ð¡ËµµÄͬʱ·¢±íÆÀÂÛ£¬Ëµ³ö×Ô¼ºµÄ¿´·¨ºÍÆäËüС»ï°éÃÇ·ÖÏíÒ²²»´íŶ£¡·¢±íÊéÆÀ»¹¿ÉÒÔ»ñµÃ»ý·ÖºÍ¾­Ñé½±Àø£¬ÈÏÕæдԭ´´ÊéÆÀ ±»²ÉÄÉΪ¾«ÆÀ¿ÉÒÔ»ñµÃ´óÁ¿½ð±Ò¡¢»ý·ÖºÍ¾­Ñé½±ÀøŶ£¡