<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_ATPKING</title><subtitle type="text">菜，终究一天会成为历史。</subtitle><id>http://feed.cnblogs.com/blog/u/34028/rss</id><updated>2012-01-25T17:30:53Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/34028/rss"/><entry><id>http://www.cnblogs.com/jicheng1014/archive/2012/01/26/2329531.html</id><title type="text">php 无法加载mysql 的module 的时候的配置的解决方案引发的思考</title><summary type="text">今天配置php 的时候，发现没配起mysql ，wordpress提示我需要 mysql 的module 之后上google搜索，大多数都是说php.ini 没加载起 之后看phpinfo() 里...</summary><published>2012-01-25T17:31:00Z</published><updated>2012-01-25T17:31:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2012/01/26/2329531.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2012/01/26/2329531.html"/><content type="html">&lt;p&gt;今天配置php 的时候，发现没配起mysql ，wordpress提示我需要 mysql 的module&lt;/p&gt;  &lt;p&gt;之后上google搜索，大多数都是说php.ini 没加载起&lt;/p&gt;  &lt;p&gt;之后看phpinfo() 里&amp;#160; 确实也没找到mysql 模块，&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;之后所谓的解决方案如“将php.ini” 放入C:\Windows&amp;#160; 环境变量等不靠谱说法。。。。。&lt;/p&gt;  &lt;p&gt;甚至拷贝ext的文件夹的dll 到System32 中等&lt;/p&gt;  &lt;p&gt;统统不靠谱&amp;#160;&amp;#160; 直到看到这篇帖子，我才发现问题 &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.haosblog.com/index.php?mod=article_read&amp;amp;id=322"&gt;http://www.haosblog.com/index.php?mod=article_read&amp;amp;id=322&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;“mysql无法找到的原因是mysql的运行库无法找到，打开mysql的安装文件夹，在bin文件夹中找到libmySQL.dll，将它复制到system32文件夹中，让mysql的运行库能在系统中注册，然后重启Apache”&lt;/p&gt;  &lt;p&gt;我是在\MySQL\MySQL Server 5.5\lib目录里找到的 &lt;/p&gt;  &lt;p&gt;实际上在自己配置的时候应该发现不是环境变量或者是没有加载到php.ini 或者没加载到extension的&amp;#160; &lt;/p&gt;  &lt;p&gt;为什么这么说呢&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;首先，在Apache&amp;#160; 的配置中&amp;#160; 已经添加了php的配置路径&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201260130434098.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201260130451948.png" width="681" height="521" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;同时phpinfo()也显示的加载到了，有兴趣的同学可以试试php.ini&amp;#160; 存在和不存在的时候的区别&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201260130463768.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201260130474716.png" width="752" height="439" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;其次，自己在php.ini里确实配置了extension_dir 的，如果这个东西没意义，那何必在配置文件里有这个选项？之后这里注意一下，他的分隔符和apache 刚好相反&amp;#160;&amp;#160; 是“\”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201260130492881.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201260130516271.png" width="681" height="521" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;之后php 也顺利加载了&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201260130526205.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201260130521679.png" width="747" height="177" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;所以，其实完全可以避免自己跟着瞎折腾的，结果大意了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/2329531.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2012/01/26/2329531.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jicheng1014/archive/2012/01/07/2316057.html</id><title type="text">android监控上传小demo之第三步 相片的提交</title><summary type="text">在上一篇“设定定期执行”之后，我们就需要处理将图片上传到指定服务器上了。 我选择的方式是将图片以post的形式传送到服务器上，这个和浏览器中提交图片是一个道理。 我们的步骤是 ======================== 1、启动相机，照相。 2、获得相机的照片文件 3、将照片文件post 提交到服务器端 ======================== 我们知道android 中的程序是可...</summary><published>2012-01-07T13:43:00Z</published><updated>2012-01-07T13:43:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2012/01/07/2316057.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2012/01/07/2316057.html"/><content type="html">&lt;p&gt;在上一篇&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2012/01/05/2312627.html"&gt;“设定定期执行”&lt;/a&gt;之后，我们就需要处理将图片上传到指定服务器上了。&lt;/p&gt; &lt;p&gt;我选择的方式是将图片以post的形式传送到服务器上，这个和浏览器中提交图片是一个道理。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我们的步骤是&lt;/p&gt; &lt;p&gt;========================&lt;/p&gt; &lt;p&gt;1、启动相机，照相。&lt;/p&gt; &lt;p&gt;2、获得相机的照片文件&lt;/p&gt; &lt;p&gt;3、将照片文件post 提交到服务器端&lt;/p&gt; &lt;p&gt;========================&lt;/p&gt; &lt;p&gt;我们知道android 中的程序是可以通过intent来共享的，我们知道相机照相的公开intent，只需要向其访问就ok了&lt;/p&gt; &lt;p&gt;当然，要调用相机，首先得在manifest 中给相机的调用权限（ps：模拟器现在也可以使用相机功能了，老版本不能用，升级下android development tools 即可，模拟器调用相机好像不需要权限）&lt;/p&gt; &lt;p&gt;&amp;lt;uses-permission android:name="android.permission.CAMERA" /&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/20120107214228496.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201072142312674.png" width="644" height="252"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;由于我们要获得相机的照片文件，所以需要给相机制定我们存储的路径，&lt;/p&gt; &lt;p&gt;我们可以参看google 官方的&lt;a href="http://developer.android.com/training/camera/photobasics.html"&gt;Taking photos simply&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我在这里做了一个dispatchTalking方法来处理这个事情&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div &gt;&lt;pre &gt;&lt;span &gt;private&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; dispatchTakePictureIntent(&lt;span &gt;int&lt;/span&gt; actionCode) throws IOException {&lt;/pre&gt;&lt;pre&gt;Intent takePictureIntent = &lt;span &gt;new&lt;/span&gt; Intent(MediaStore.ACTION_IMAGE_CAPTURE);&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;File f = createImageFile();&lt;span &gt;//生成文件路径&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));&lt;/pre&gt;&lt;pre&gt;startActivityForResult(takePictureIntent, actionCode);&lt;/pre&gt;&lt;pre &gt;}&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;辅助代码如下所示，其中mCurrentPhotoPath为中间变量 &#xD;
&lt;style type="text/css"&gt;&#xD;
&#xD;
&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;private&lt;/span&gt; File createImageFile() throws IOException {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;// Create an image file name&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;String timeStamp = &lt;span &gt;new&lt;/span&gt; SimpleDateFormat(&lt;span &gt;"yyyyMMdd_HHmmss"&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;.format(&lt;span &gt;new&lt;/span&gt; Date());&lt;/pre&gt;&lt;pre &gt;String imageFileName = JPEG_FILE_PREFIX + timeStamp + &lt;span &gt;"_"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;File image = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX,&lt;/pre&gt;&lt;pre &gt;getAlbumDir());&lt;/pre&gt;&lt;pre&gt;mCurrentPhotoPath = image.getAbsolutePath();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;return&lt;/span&gt; image;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
&#xD;
&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;private&lt;/span&gt; File getAlbumDir() {&lt;/pre&gt;&lt;pre&gt;File storageDir = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;// 检测sd卡是否可以写入&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (Environment.MEDIA_MOUNTED.equals(Environment&lt;/pre&gt;&lt;pre&gt;.getExternalStorageState())) {&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;storageDir = mAlbumStorageDirFactory&lt;/pre&gt;&lt;pre &gt;.getAlbumStorageDir(getAlbumName());&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (storageDir != &lt;span &gt;null&lt;/span&gt;) {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;if&lt;/span&gt; (!storageDir.mkdirs()) {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (!storageDir.exists()) {&lt;/pre&gt;&lt;pre&gt;Log.d(getString(R.&lt;span &gt;string&lt;/span&gt;.app_name),&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;"failed to create directory"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;return&lt;/span&gt; &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre &gt;}&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre &gt;}&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;} &lt;span &gt;else&lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;Log.v(getString(R.&lt;span &gt;string&lt;/span&gt;.app_name),&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;"External storage is not mounted READ/WRITE."&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;return&lt;/span&gt; storageDir;&lt;/pre&gt;&lt;pre &gt;}&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;private&lt;/span&gt; String getAlbumName() {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;return&lt;/span&gt; &lt;span &gt;"InspectorAlbum"&lt;/span&gt;;&lt;/pre&gt;&lt;pre &gt;}&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
&#xD;
&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ok,准备工作完毕，我们调用的时候只需要调用dispatchTakePictureIntent即可，我这里是绑定在optionsMenu里的&lt;/p&gt;&lt;pre &gt;&lt;span &gt;case&lt;/span&gt; R.id.TakePhoto:&#xD;
            &lt;span &gt;try&lt;/span&gt; {&#xD;
                dispatchTakePictureIntent(CAMERA_INTENT_SIGN);&#xD;
            } &lt;span &gt;catch&lt;/span&gt; (IOException e) {&#xD;
                &lt;span &gt;// TODO Auto-generated catch block&lt;/span&gt;&#xD;
                e.printStackTrace();&#xD;
                Toast.makeText(getApplicationContext(), &lt;span &gt;"存储照片失败"&lt;/span&gt;,&#xD;
                        Toast.LENGTH_SHORT).show();&#xD;
            }&lt;/pre&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
&#xD;
&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之后接收图片很简单，只需要指定onActivityResult中处理就ok了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;@Override&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; onActivityResult(&lt;span &gt;int&lt;/span&gt; requestCode, &lt;span &gt;int&lt;/span&gt; resultCode, Intent data) {&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;Log.v(getString(R.&lt;span &gt;string&lt;/span&gt;.app_name), &lt;span &gt;"resultCode="&lt;/span&gt; + resultCode&lt;/pre&gt;&lt;pre &gt;+ &lt;span &gt;",requestCode="&lt;/span&gt; + requestCode);&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (resultCode == Activity.RESULT_OK&lt;/pre&gt;&lt;pre&gt;&amp;amp;&amp;amp; requestCode == CAMERA_INTENT_SIGN) {&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;Log.v(getString(R.&lt;span &gt;string&lt;/span&gt;.app_name), &lt;span &gt;"存储的相片地址为"&lt;/span&gt; + mCurrentPhotoPath);&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;//启动服务，上传图片的干活&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;Intent intent = &lt;span &gt;new&lt;/span&gt; Intent(getApplicationContext(),&lt;/pre&gt;&lt;pre &gt;UploadImgService.&lt;span &gt;class&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;intent.putExtra(&lt;span &gt;"storageURI"&lt;/span&gt;, mCurrentPhotoPath);&lt;/pre&gt;&lt;pre &gt;startService(intent);&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;}&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;style type="text/css"&gt;&#xD;
&#xD;
&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之后就是这个UploadImgService 服务了，我写的这个服务主要的实现目的从名字就可以看的出来：图片的上传&lt;/p&gt;&#xD;
&lt;p&gt;以下是我自己做的service的笔记&lt;/p&gt;&#xD;
&lt;p&gt;---------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;android服务有两种&lt;/p&gt;&#xD;
&lt;p&gt;分为本地service 和 remote service，本地service只调用自己的application 而remote service 可以走其他的application&lt;/p&gt;&#xD;
&lt;p&gt;remote service 使用Android interface definition language (AIDL) 描述自己&lt;/p&gt;&#xD;
&lt;p&gt;什么时候用local service 什么时候用remote service&lt;/p&gt;&#xD;
&lt;p&gt;当一个service 严格的只被同一个程序的模块调用的时候，客户端应该使用Context.startService() 启动一个service，这个service就是local service，因为他的作用是，为这个application做一个后台的任务。&lt;/p&gt;&#xD;
&lt;p&gt;如果说service支持onBind()方法，则他是remote service，他可以被Context.bindService()这个线程间通信请求调用。&lt;/p&gt;&#xD;
&lt;p&gt;一般情况下，我们不把一个程序既做成local&amp;nbsp; 又做成remote service&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;Local Services&lt;/p&gt;&#xD;
&lt;p&gt;开始&amp;nbsp; Context.startService()&lt;/p&gt;&#xD;
&lt;p&gt;结束&amp;nbsp; Context.stopService 或 Service 自身调用stopSelf();&lt;/p&gt;&#xD;
&lt;p&gt;当Context.startService() 被调用但是Service还没有被创建的时候，系统会自动初始化，并且调用service的onStartCommand()方法。&lt;/p&gt;&#xD;
&lt;p&gt;如果说调用Context.startService 的时候Service已经开始了，他会重新执行onStartCommand 但没有重新实例化一个服务&lt;/p&gt;&#xD;
&lt;p&gt;如果说想只做一个Thread 在Service 中，可以考虑将其放入OnCreate 中&amp;nbsp;&amp;nbsp; 保证其只执行一次，但OnCreate 中是无法调用到传来的Intent 的信息的，如果想用Intent 的话，就只有在onStartCommand 用。&lt;/p&gt;&#xD;
&lt;p&gt;AIDL Services&lt;/p&gt;&#xD;
&lt;p&gt;建立一个Remote Service 的步骤&lt;/p&gt;&#xD;
&lt;p&gt;1、写一个向client定义的接口的aidl文件，aidl 文件使用java 语法，以aidl 后缀结尾。使用和Android Project同样的命名空间&lt;/p&gt;&#xD;
&lt;p&gt;2、在Eclipse 的src 下建立此文件，Android Eclipse 插件会调用AIDL 编译器去省城一个java interface &lt;/p&gt;&#xD;
&lt;p&gt;3、实现一个Service 并且 通过onBind() 返回interface &lt;/p&gt;&#xD;
&lt;p&gt;4、在manifest文件中加入服务配置&lt;/p&gt;&#xD;
&lt;p&gt;------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们在这里使用的是 local service，去发起一个post 提交。&lt;/p&gt;&#xD;
&lt;p&gt;值得注意的是，由于service 仍然是在主线程进行的，所以说，受到5秒规则（程序busy时间超过5s会提示用户是否结束该程序），又由于post一张照片的时间很有可能是大于5s的，所以我们需要在这个服务上再开启一个子线程来处理post提交。&lt;/p&gt;&#xD;
&lt;p&gt;android本身的httpClient 支持post提交，但是对复杂form模型的支持不是很好，这个时候我们需要使用apache的组件httpcomponent来实现，下载地址在&lt;a href="http://hc.apache.org/downloads.cgi"&gt;这里&lt;/a&gt; 下载解压后，我们需要在项目属性的java buildpath 的library添加 httpclient和httpmime&amp;nbsp; ，他们放在下载文件的lib文件夹里。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201072142362212.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201201/201201072142408685.png" width="644" height="447"&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ok&lt;/p&gt;&#xD;
&lt;p&gt;一步一步来，最先解决如何post一张图片的问题：&lt;/p&gt;&#xD;
&lt;p&gt;我们首先从intent中得到file的地址，之后将其添加到post 提交&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;List&amp;lt;NameValuePair&amp;gt; &lt;span &gt;params&lt;/span&gt; = &lt;span &gt;new&lt;/span&gt; ArrayList&amp;lt;NameValuePair&amp;gt;();&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;params&lt;/span&gt;.add(&lt;span &gt;new&lt;/span&gt; BasicNameValuePair(&lt;span &gt;"image"&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;intent.getStringExtra(&lt;span &gt;"storageURI"&lt;/span&gt;)));&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;String ServerAddress = settings.getString(&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;"serverip_preference"&lt;/span&gt;, &lt;span &gt;"http://10.0.2.2:8888/upload"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;ImgPostHelper.post(ServerAddress, &lt;span &gt;params&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;这里使用了一个自己写的ImgPostHelper 帮助类，代码如下&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;package info.atpking.cityInspectorsHelper;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;import java.io.File;&lt;/pre&gt;&lt;pre&gt;import java.io.IOException;&lt;/pre&gt;&lt;pre &gt;import java.util.List;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;import org.apache.http.NameValuePair;&lt;/pre&gt;&lt;pre&gt;import org.apache.http.client.HttpClient;&lt;/pre&gt;&lt;pre &gt;import org.apache.http.client.methods.HttpPost;&lt;/pre&gt;&lt;pre&gt;import org.apache.http.entity.mime.HttpMultipartMode;&lt;/pre&gt;&lt;pre &gt;import org.apache.http.entity.mime.MultipartEntity;&lt;/pre&gt;&lt;pre&gt;import org.apache.http.entity.mime.content.FileBody;&lt;/pre&gt;&lt;pre &gt;import org.apache.http.entity.mime.content.StringBody;&lt;/pre&gt;&lt;pre&gt;import org.apache.http.impl.client.DefaultHttpClient;&lt;/pre&gt;&lt;pre &gt;import org.apache.http.protocol.BasicHttpContext;&lt;/pre&gt;&lt;pre&gt;import org.apache.http.protocol.HttpContext;&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; ImgPostHelper {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; post(String url, List&amp;lt;NameValuePair&amp;gt; nameValuePairs) {&lt;/pre&gt;&lt;pre&gt;HttpClient httpClient = &lt;span &gt;new&lt;/span&gt; DefaultHttpClient();&lt;/pre&gt;&lt;pre &gt;HttpContext localContext = &lt;span &gt;new&lt;/span&gt; BasicHttpContext();&lt;/pre&gt;&lt;pre&gt;HttpPost httpPost = &lt;span &gt;new&lt;/span&gt; HttpPost(url);&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;try&lt;/span&gt; {&lt;/pre&gt;&lt;pre &gt;MultipartEntity entity = &lt;span &gt;new&lt;/span&gt; MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;for&lt;/span&gt;(&lt;span &gt;int&lt;/span&gt; index=0; index &amp;lt; nameValuePairs.size(); index++) {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;if&lt;/span&gt;(nameValuePairs.get(index).getName().equalsIgnoreCase(&lt;span &gt;"image"&lt;/span&gt;)) {&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;// If the key equals to "image", we use FileBody to transfer the data&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;entity.addPart(nameValuePairs.get(index).getName(), &lt;span &gt;new&lt;/span&gt; FileBody(&lt;span &gt;new&lt;/span&gt; File (nameValuePairs.get(index).getValue())));&lt;/pre&gt;&lt;pre &gt;} &lt;span &gt;else&lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span &gt;// Normal string data&lt;/span&gt;&lt;/pre&gt;&lt;pre &gt;entity.addPart(nameValuePairs.get(index).getName(), &lt;span &gt;new&lt;/span&gt; StringBody(nameValuePairs.get(index).getValue()));&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre &gt;}&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;httpPost.setEntity(entity);&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;httpClient.execute(httpPost, localContext);&lt;/pre&gt;&lt;pre&gt;} &lt;span &gt;catch&lt;/span&gt; (IOException e) {&lt;/pre&gt;&lt;pre &gt;e.printStackTrace();&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre &gt;}&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里相当于我们post提交了一个图片，他的key name 为 image&amp;nbsp;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;之后我们要实现使用一个线程来处理这个上传&lt;/p&gt;&#xD;
&lt;p&gt;我们在服务的OnStart 中填入一个线程&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; onStart(Intent intent, &lt;span &gt;int&lt;/span&gt; startId) {&lt;/pre&gt;&lt;pre&gt;super.onStart(intent, startId);&lt;/pre&gt;&lt;pre &gt;Log.v(TAGLOG, &lt;span &gt;"我被启动了"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre &gt;Thread thr = &lt;span &gt;new&lt;/span&gt; Thread(&lt;span &gt;null&lt;/span&gt;, mTask, &lt;span &gt;"AlarmService_Service"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;thr.start();&lt;/pre&gt;&lt;pre &gt;&lt;span &gt;this&lt;/span&gt;.intent = intent;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre&gt;之后我们要实现这个mTask   &lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;pre &gt;Runnable mTask = &lt;span &gt;new&lt;/span&gt; Runnable() {&#xD;
        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; run() {&#xD;
            &lt;span &gt;// 干活的家伙&lt;/span&gt;&#xD;
            &lt;span &gt;if&lt;/span&gt; (intent.getExtras().containsKey(&lt;span &gt;"storageURI"&lt;/span&gt;)) {&#xD;
&#xD;
                Log.v(getString(R.&lt;span &gt;string&lt;/span&gt;.app_name), &lt;span &gt;"在这里上传"&lt;/span&gt;);&#xD;
                List&amp;lt;NameValuePair&amp;gt; &lt;span &gt;params&lt;/span&gt; = &lt;span &gt;new&lt;/span&gt; ArrayList&amp;lt;NameValuePair&amp;gt;();&#xD;
&#xD;
                &lt;span &gt;params&lt;/span&gt;.add(&lt;span &gt;new&lt;/span&gt; BasicNameValuePair(&lt;span &gt;"image"&lt;/span&gt;,&#xD;
                        intent.getStringExtra(&lt;span &gt;"storageURI"&lt;/span&gt;)));&#xD;
                &#xD;
                String ServerAddress = settings.getString(&#xD;
                        &lt;span &gt;"serverip_preference"&lt;/span&gt;, &lt;span &gt;"http://10.0.2.2:8888/upload"&lt;/span&gt;);&#xD;
&#xD;
                ImgPostHelper.post(ServerAddress, &lt;span &gt;params&lt;/span&gt;);&#xD;
                &#xD;
            }&#xD;
            UploadImgService.&lt;span &gt;this&lt;/span&gt;.stopSelf();&#xD;
        }&#xD;
&#xD;
&#xD;
    };&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre &gt;注意一下，这里的10.0.2.2 是你虚拟机访问你的机器的地址，我在机器上搭建了一个node.js 的接受图片post的小网站。&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&lt;pre &gt;至此，手机端到这里就完全结束了，下一讲说怎样用node.js 搭建接收端（当然你可以用.net 做一个接收post的页面，什么技术都可以）&lt;/pre&gt;&#xD;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&#xD;
&lt;/style&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/2316057.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2012/01/07/2316057.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jicheng1014/archive/2012/01/05/2312627.html</id><title type="text">android监控上传小demo之第二步 设定定期执行</title><summary type="text">在上一篇博客中我们介绍了怎样让程序一开机就运行那么，根据我们上次的思路“开机运行一个定时器，定时执行某项服务”，来实现定期执行上传任务我们需要的是AlarmManageralarmmanager的作用类似于定时器，它可以让android在未来某一时刻运行某个程序，他的好处在于哪怕启动他的activity现在是处于inactive 状态，它仍然会精准的执行，除非你重启设备。alarmManager 可以支持很多中触发形式，有单次，有循环，有自定义循环三种模式（想想我们闹铃的三种模式），我们可以在API上看到这些信息set(int type, long triggerAtTime, Pending</summary><published>2012-01-04T17:07:00Z</published><updated>2012-01-04T17:07:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2012/01/05/2312627.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2012/01/05/2312627.html"/><content type="html">&lt;p&gt;在&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2011/12/26/2301852.html"&gt;上一篇博客&lt;/a&gt;中我们介绍了怎样让程序一开机就运行&lt;/p&gt;&#xD;
&lt;p&gt;那么，根据我们上次的思路&amp;ldquo;开机运行一个定时器，定时执行某项服务&amp;rdquo;，来实现定期执行上传任务&lt;/p&gt;&#xD;
&lt;p&gt;我们需要的是AlarmManager&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;alarmmanager的作用类似于定时器，它可以让android在未来某一时刻运行某个程序，他的好处在于哪怕启动他的activity现在是处于inactive 状态，它仍然会精准的执行，除非你重启设备。&lt;/p&gt;&#xD;
&lt;p&gt;alarmManager 可以支持很多中触发形式，有单次，有循环，有自定义循环三种模式（想想我们闹铃的三种模式），我们可以在API上看到这些信息&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;a href="https://developer.android.com/reference/android/app/AlarmManager.html#set(int, long, android.app.PendingIntent)"&gt;set&lt;/a&gt;(int type, long triggerAtTime, &lt;a href="https://developer.android.com/reference/android/app/PendingIntent.html"&gt;PendingIntent&lt;/a&gt; operation)&lt;/p&gt;&#xD;
&lt;p&gt;Schedule an alarm. &lt;br /&gt;&lt;a href="https://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int, long, long, android.app.PendingIntent)"&gt;setInexactRepeating&lt;/a&gt;(int type, long triggerAtTime, long interval, &lt;a href="https://developer.android.com/reference/android/app/PendingIntent.html"&gt;PendingIntent&lt;/a&gt; operation)&lt;/p&gt;&#xD;
&lt;p&gt;Schedule a repeating alarm that has inexact trigger time requirements; for example, an alarm that repeats every hour, but not necessarily at the top of every hour. &lt;br /&gt;&lt;a href="https://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int, long, long, android.app.PendingIntent)"&gt;setRepeating&lt;/a&gt;(int type, long triggerAtTime, long interval, &lt;a href="https://developer.android.com/reference/android/app/PendingIntent.html"&gt;PendingIntent&lt;/a&gt; operation)&lt;/p&gt;&#xD;
&lt;p&gt;Schedule a repeating alarm.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们这里使用的是循环&amp;nbsp;&amp;nbsp;&amp;nbsp; 也就是setRepeating&lt;/p&gt;&#xD;
&lt;p&gt;说下这个参数&lt;/p&gt;&#xD;
&lt;p&gt;首先type 是代表计时器的几种不同的计时方式，他们包含ELAPSED_REALTIME、&lt;a href="https://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME_WAKEUP"&gt;ELAPSED_REALTIME_WAKEUP&lt;/a&gt;、RTC、以及RTC_WAKEUP&lt;/p&gt;&#xD;
&lt;p&gt;Elapse 系列是从开机开始算起，包括机器休眠时间&amp;nbsp;&amp;nbsp; 而rtc ，指的是当前时间，之后加没加wakeup 的参数修饰的意思是&amp;nbsp;&amp;nbsp; 到达时间后是否在到达时间后唤醒设备处理（有wakeup），还是等待用户wakeup机器后运行（无walkup）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;后面的两个triggerAtTime和interval 代表的是起始时间和步长，最后一个是 operation&amp;nbsp; 你需要启动的intent&amp;nbsp; 在这里注意一下，此处的pendingintent 是预备使用的intent&lt;/p&gt;&#xD;
&lt;p&gt;ok，放代码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;pre &gt;PendingIntent mAlarmSender = PendingIntent.getService(context, 0, &lt;span &gt;new&lt;/span&gt; Intent(&#xD;
                context, UploadImgService.&lt;span &gt;class&lt;/span&gt;), 0);&#xD;
&#xD;
        &lt;span &gt;long&lt;/span&gt; firstTime = SystemClock.elapsedRealtime();&#xD;
        AlarmManager am = (AlarmManager) context&#xD;
                .getSystemService(context.ALARM_SERVICE);&#xD;
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,&#xD;
                10 * 6000, mAlarmSender);&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意一下，这个intent 就是我们要运行的服务，&lt;/p&gt;&#xD;
&lt;p&gt;这个含义就是每隔1min运行一次uploadImgService 的这个服务&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下次我们着重讲uploadImgService 的实现&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/2312627.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2012/01/05/2312627.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jicheng1014/archive/2011/12/26/2301852.html</id><title type="text">android监控上传小demo之第一步 自启动运行</title><summary type="text">有个小计划练手，就是做一个拍照，之后自动上传到某个服务器上的小demo思路是这样的，拍照的时候加一个标志位表示这个照片要同步到网络上且还未上传。之后系统定期检查是否有上传任务，若有，则执行上传，若没有，则等待至下一次检测点ok，转化为程序思路，具体如下，为实现自启动，需要捕获我们的设备运行信息，可以使用BroadcastReceiver这个东西但是我们启动的是alarmManager为什么不直接用上传的Service，之后在Service 内部实现一个循环等待的功能?因为android机制当中，里面的wait 是指你在active 的时候的时间，如果程序本身是inactive或者被pause了</summary><published>2011-12-26T04:15:00Z</published><updated>2011-12-26T04:15:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2011/12/26/2301852.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2011/12/26/2301852.html"/><content type="html">&lt;p&gt;有个小计划练手，就是做一个拍照，之后自动上传到某个服务器上的小demo&lt;/p&gt;&#xD;
&lt;p&gt;思路是这样的，&lt;/p&gt;&#xD;
&lt;p&gt;拍照的时候加一个标志位表示这个照片要同步到网络上且还未上传。&lt;/p&gt;&#xD;
&lt;p&gt;之后系统定期检查是否有上传任务，若有，则执行上传，若没有，则等待至下一次检测点&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ok，转化为程序思路，具体如下，&lt;/p&gt;&#xD;
&lt;p&gt;为实现自启动，需要捕获我们的设备运行信息，可以使用BroadcastReceiver这个东西&lt;/p&gt;&#xD;
&lt;p&gt;但是我们启动的是alarmManager&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;为什么不直接用上传的Service，之后在Service 内部实现一个循环等待的功能?&lt;/p&gt;&#xD;
&lt;p&gt;因为android机制当中，里面的wait 是指你在active 的时候的时间，如果程序本身是inactive或者被pause了的话，等待的时间就会不准。同时，如果一直监听，则service是不会被回收的，这点很不爽。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面就是这个demo的第一步，捕获系统开机，自动运行程序&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;android认为这个事情比较重要，所以要在mainfest 中授权，&lt;/p&gt;&#xD;
&lt;p&gt;授权方式如下&lt;/p&gt;&#xD;
&lt;p&gt;在manifest 根节点下直接添加权限节点&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112261214583250.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112261214581331.png" alt="image" width="612" height="136" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在有了权限之后，我们还要写一个receiver指定谁接受这个东西&lt;/p&gt;&#xD;
&lt;p&gt;照例，我们需要像activity一样的在mainfest 里指定他&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;同时这里因为要捕获系统的启动，所以说需要在intent-filter设置一下&amp;nbsp; 详情如下所示&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112261214593000.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/20111226121459525.png" alt="image" width="572" height="153" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之后OnBootReceiver 的代码也很简单，&lt;/p&gt;&#xD;
&lt;p&gt;package info.atpking.cityHelper;&lt;/p&gt;&#xD;
&lt;p&gt;import android.content.BroadcastReceiver; &lt;br /&gt;import android.content.Context; &lt;br /&gt;import android.content.Intent; &lt;br /&gt;import android.util.Log;&lt;/p&gt;&#xD;
&lt;p&gt;public class OnBootReceiver extends BroadcastReceiver { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String LOGTAG = "ATPKINGLOG"; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onReceive(Context context, Intent intent) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.v(LOGTAG,"我已随系统启动了哇亲"); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 在这里接下来我们要开启AlarmManager 了 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之后就可以在虚拟机上跑了。&lt;/p&gt;&#xD;
&lt;p&gt;注意，虚拟机需要首先加载一次这个程序之后才能随系统开机运行&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;直接点运行，出来新建项目时默认的activity后，这个时候系统已经将其receiver 注册了&lt;/p&gt;&#xD;
&lt;p&gt;关掉虚拟机，之后再启动虚拟机，我们就可以在LogCat 上看到我们的开机运行了。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112261214592510.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112261215001463.png" alt="image" width="678" height="150" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下一篇，介绍AlarmManager&amp;nbsp;的用法&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/2301852.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2011/12/26/2301852.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jicheng1014/archive/2011/12/13/2286143.html</id><title type="text">有关于Node.js 的最简单的概念</title><summary type="text">不错的入门教程在这里http://www.ibm.com/developerworks/cn/opensource/os-nodejs/现在的node.js（v0.6.5）已经脱离了cygwin了，所以不用在去下载了安装好msi 之后node 会装在系统盘符的Programs Files 里，同时自动在系统的环境变量里填入了这个值之后我们就可以在cmd里使用node 了比如最基础的 可以查看node 的版本 node --version 注意，是两个横线，效果如下所示我们编写了一个最简单的脚本程序，如下所示var http = require(&amp;#39;http&amp;#39;);http.crea</summary><published>2011-12-13T07:10:00Z</published><updated>2011-12-13T07:10:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2011/12/13/2286143.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2011/12/13/2286143.html"/><content type="html">&lt;p&gt;不错的入门教程在这里&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.ibm.com/developerworks/cn/opensource/os-nodejs/"&gt;http://www.ibm.com/developerworks/cn/opensource/os-nodejs/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在的node.js（v0.6.5）已经脱离了cygwin了，所以不用在去下载了&lt;/p&gt;&#xD;
&lt;p&gt;安装好msi 之后node 会装在系统盘符的Programs Files 里，同时自动在系统的环境变量里填入了这个值&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之后我们就可以在cmd里使用node 了&lt;/p&gt;&#xD;
&lt;p&gt;比如最基础的&amp;nbsp; 可以查看node 的版本&amp;nbsp;&amp;nbsp;&amp;nbsp; node --version&amp;nbsp;&amp;nbsp; 注意，是两个横线，效果如下所示&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509304789.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509305378.png" alt="image" width="420" height="54" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们编写了一个最简单的脚本程序，如下所示&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span &gt;var&lt;/span&gt; http = require(&lt;span &gt;'http'&lt;/span&gt;);&#xD;
&#xD;
http.createServer(&lt;span &gt;function&lt;/span&gt; (request,response){&#xD;
    response.writeHead(200,{&lt;span &gt;'Content-Type'&lt;/span&gt;:&lt;span &gt;"text/plain"&lt;/span&gt;});&#xD;
    response.end(&lt;span &gt;'Hello World\n'&lt;/span&gt;);&#xD;
}).listen(8124);&#xD;
&#xD;
console.log(&lt;span &gt;"Server running at http://127.0.0.1:8124/"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我将其命名为example.js&amp;nbsp;&amp;nbsp; 存储在D:\CMDFiles 文件夹中&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;运行这个js 十分简单，如下图所示&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509317919.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509319381.png" alt="image" width="401" height="77" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之后我们可以在浏览器中查看到效果&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509323940.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509338499.png" alt="image" width="431" height="258" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之后信息如下所示&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509345251.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509379419.png" alt="image" width="827" height="330" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509371960.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201112/201112131509383662.png" alt="image" width="448" height="282" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/2286143.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2011/12/13/2286143.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jicheng1014/archive/2011/12/08/2280302.html</id><title type="text">有关于android xml 文件无自动填充的解决方法</title><summary type="text">今日使用Eclipse 的时候,出现了这个问题 layout 文件无法使用intelligence 功能 后来发现eclipse 打开的时候，将其理解为一个“纯粹的”xml文件，平时还有一个视图tab都没有出来 解决方案十分简单，右键点击这个xml，选择 open with …. 之后选择对应的android XXX editor 即可</summary><published>2011-12-08T02:08:00Z</published><updated>2011-12-08T02:08:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2011/12/08/2280302.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2011/12/08/2280302.html"/><content type="html">&lt;p&gt;今日使用Eclipse 的时候,出现了这个问题&lt;/p&gt;  &lt;p&gt;layout 文件无法使用intelligence 功能&lt;/p&gt;  &lt;p&gt;后来发现eclipse 打开的时候，将其理解为一个“纯粹的”xml文件，平时还有一个视图tab都没有出来&lt;/p&gt;  &lt;p&gt;解决方案十分简单，右键点击这个xml，选择&amp;#160; open with ….&amp;#160; 之后选择对应的android XXX editor 即可&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/2280302.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2011/12/08/2280302.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jicheng1014/archive/2011/05/19/2051191.html</id><title type="text">关于EntityFramework 4.1 中Code First方式的一些记录</title><summary type="text">1、在一对多关系中，我们需要指定一个外键，同时我们使用virtual 这个标识标识另外一个对象的引用 比如说以下模型 public class Phone{ public int Id{get;set;} public int PhoneBrandId{get;set;} public virtual PhoneBrand PhoneBrand{get;set;}}public class Pho...</summary><published>2011-05-19T08:09:00Z</published><updated>2011-05-19T08:09:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2011/05/19/2051191.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2011/05/19/2051191.html"/><content type="html">&lt;p&gt;1、在一对多关系中，我们需要指定一个外键，同时我们使用virtual 这个标识标识另外一个对象的引用 &lt;/p&gt;  &lt;p&gt;比如说以下模型&lt;/p&gt;  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; Phone&#xD;
{&#xD;
    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;int&lt;/span&gt; Id{get;set;}&#xD;
    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;int&lt;/span&gt; PhoneBrandId{get;set;}&#xD;
    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; PhoneBrand PhoneBrand{get;set;}&#xD;
}&#xD;
&lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; PhoneBrand{&#xD;
    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;int&lt;/span&gt; Id{get;set;}&#xD;
    &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; BrandName{get;set;}&#xD;
    &lt;span &gt;public&lt;/span&gt; ICollection&amp;lt;Phone&amp;gt; Phones&#xD;
}&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;#160;&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;注意，在具体的想访问Phone对象中的PhoneBrand 之前，这个PhoneBrand 都是null 的，只有PhoneBrandId 是有值的&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;#160;&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;2、关于在两个对象中有重复引用的情况下的处理&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;比如说我们可能遇见这种情况，我们需要保存一篇文章的发表者和修改者&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;比如这里&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; Post&#xD;
    {&#xD;
        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;int&lt;/span&gt; Id { get; set; }&#xD;
        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; Title { get; set; }&#xD;
        &lt;span &gt;public&lt;/span&gt; DateTime DateCreated { get; set; }&#xD;
        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; Content { get; set; }&#xD;
        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;int&lt;/span&gt; BlogId { get; set; }&#xD;
        &lt;span &gt;public&lt;/span&gt; Blog Blog { get; set; }&#xD;
        &lt;span &gt;public&lt;/span&gt; ICollection&amp;lt;Comment&amp;gt; Comments { get; set; }&#xD;
        &lt;span &gt;//此处是个典型，两个都引用了Person这个对象，但是请注意，这里并没有直接有id号&lt;/span&gt;&#xD;
         &lt;span &gt;public&lt;/span&gt; Person CreatedBy { get; set; }&#xD;
        &lt;span &gt;public&lt;/span&gt; Person UpdatedBy { get; set; }&#xD;
    }&lt;/pre&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;#160;&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;&amp;#160;&lt;/pre&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;pre &gt;我们在做Person这个对象的时候，就需要使用[InverseProperty(对应的字段)]标记一下&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; Person&#xD;
    {&#xD;
        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;int&lt;/span&gt; Id { get; set; }&#xD;
        &lt;span &gt;public&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; Name { get; set; }&#xD;
        [InverseProperty(&lt;span &gt;&amp;quot;CreatedBy&amp;quot;&lt;/span&gt;)]&#xD;
        &lt;span &gt;public&lt;/span&gt; List&amp;lt;Post&amp;gt; PostsWritten { get; set; }&#xD;
        [InverseProperty(&lt;span &gt;&amp;quot;UpdatedBy&amp;quot;&lt;/span&gt;)]&#xD;
        &lt;span &gt;public&lt;/span&gt; List&amp;lt;Post&amp;gt; PostsUpdated { get; set; }&#xD;
    }&lt;/pre&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/2051191.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2011/05/19/2051191.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jicheng1014/archive/2011/03/12/1982274.html</id><title type="text">chrome 修改临时文件地址位置</title><summary type="text">warning：此修改有风险，技术不太好的朋友就别试了 众所周知chrome 的临时文件是存在C盘的 若要将其更改，则可以简单的在启动项后面加入--user-data-dir= “路径” 的方法 但是这种对于其他应用程序调用chrome是无效的 针对这种情况，我们需要更改注册表的 分别在这几个位置加入参数 HKEY_CLASSES_ROOT\http\shell\open\command HKEY...</summary><published>2011-03-12T07:25:00Z</published><updated>2011-03-12T07:25:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2011/03/12/1982274.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2011/03/12/1982274.html"/><content type="html">&lt;p&gt;warning：此修改有风险，技术不太好的朋友就别试了&lt;/p&gt;  &lt;p&gt;众所周知chrome 的临时文件是存在C盘的&lt;/p&gt;  &lt;p&gt;若要将其更改，则可以简单的在启动项后面加入--user-data-dir= “路径” 的方法&lt;/p&gt;  &lt;p&gt;但是这种对于其他应用程序调用chrome是无效的&amp;#160; &lt;/p&gt;  &lt;p&gt;针对这种情况，我们需要更改注册表的&lt;/p&gt;  &lt;p&gt;分别在这几个位置加入参数&lt;/p&gt;  &lt;p&gt;HKEY_CLASSES_ROOT\http\shell\open\command&lt;/p&gt;  &lt;p&gt;HKEY_CLASSES_ROOT\ftp\shell\open\command&lt;/p&gt;  &lt;p&gt;HKEY_CLASSES_ROOT\https\shell\open\command&lt;/p&gt;  &lt;p&gt;HKEY_CLASSES_ROOT\ChromeHTML\shell\open\command&lt;/p&gt;  &lt;p&gt;如果实在是懒的抽筋，这有个脚本，调整下就ok&lt;/p&gt;  &lt;p&gt;Windows Registry Editor Version 5.00&lt;/p&gt;  &lt;p&gt;[HKEY_CLASSES_ROOT\http\shell\open\command]&lt;/p&gt;  &lt;p&gt;@=&amp;quot;\&amp;quot;C:\\Users\\atpking\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe\&amp;quot; --user-data-dir=F:\\TmpData \&amp;quot;%1\&amp;quot;&amp;quot;&lt;/p&gt;  &lt;p&gt;[HKEY_CLASSES_ROOT\ftp\shell\open\command]&lt;/p&gt;  &lt;p&gt;@=&amp;quot;\&amp;quot;C:\\Users\\atpking\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe\&amp;quot; --user-data-dir=F:\\TmpData \&amp;quot;%1\&amp;quot;&amp;quot;&lt;/p&gt;  &lt;p&gt;[HKEY_CLASSES_ROOT\https\shell\open\command]&lt;/p&gt;  &lt;p&gt;@=&amp;quot;\&amp;quot;C:\\Users\\atpking\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe\&amp;quot; --user-data-dir=F:\\TmpData \&amp;quot;%1\&amp;quot;&amp;quot;&lt;/p&gt;  &lt;p&gt;[HKEY_CLASSES_ROOT\ChromeHTML\shell\open\command]&lt;/p&gt;  &lt;p&gt;@=&amp;quot;\&amp;quot;C:\\Users\\atpking\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe\&amp;quot; --user-data-dir=F:\\TmpData \&amp;quot;%1\&amp;quot;&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;其中C:\\Users\\atpking\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe是chrome地址&lt;/p&gt;  &lt;p&gt;F:\\TmpData是临时文件夹存储路径&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/1982274.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2011/03/12/1982274.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jicheng1014/archive/2011/01/13/1934343.html</id><title type="text">使用sql 账户 登录失败需要检查的地方</title><summary type="text">今天偶然换sql server 2008 登录，平时都用的是windows 账户直接连接登录，就没注意     链接后出现  A connection was successfully established with the server, but then an error occurred during the login process. (provider: Shared memory ...</summary><published>2011-01-13T02:53:00Z</published><updated>2011-01-13T02:53:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2011/01/13/1934343.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2011/01/13/1934343.html"/><content type="html">&lt;p&gt;今天偶然换sql server 2008 登录，平时都用的是windows 账户直接连接登录，就没注意&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;链接后出现&amp;#160; &lt;/p&gt;  &lt;p&gt;A connection was successfully established with the server, but then an error occurred during the login process. (provider: Shared memory Provider, error: 0 –No process is on the other end of the pipe.) &lt;/p&gt;  &lt;p&gt;(Microsoft SQL Server, 错误:233)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053056933.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053086150.png" width="644" height="201" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;解决办法是&amp;#160;&amp;#160; 确保以下内容是正确的&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;服务器属性中的安全性&amp;#160;&amp;#160; （对象资源管理器选中服务器—&amp;gt;右键，属性)，确保sql server 和windows 身份验证模式被选中&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053109970.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053127169.png" width="644" height="341" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;同时检查下sa的属性&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053147957.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053186335.png" width="644" height="409" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;最后，确保你的sqlserver远程连接是开启的（本地通过其他程序连接也算远程连接的）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053188353.png"&gt;&lt;img style="border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053194897.png" width="244" height="177" /&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053218061.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101131053223209.png" width="360" height="178" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;最后记得重启下sql server 服务，或者直接重启计算机就可以解决了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/1934343.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2011/01/13/1934343.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jicheng1014/archive/2011/01/12/1933402.html</id><title type="text">Discuz!NT 慢慢分析之开篇---Config 的实现</title><summary type="text">其实很早的时候就想琢磨下Discuz!NT的一些东西,今天着重吧Discuz 的有关于配置的信息研究了下，拿出来与大家共同分享下 Discuz!NT在web.config自定义了httpModule 模块去实现了IHttpModule 一行一行的讲解：OnlineUsers.ResetOnLineList首先将用户信息清零context.BeginRequest += new EventHandler(ReUrl_BeginRequest) 这行代码指定地址请求处理的方法（ReUrl_BeginRequest这个方法是处理URL 地址的)if(eventTimer == null &amp;&amp; Sch</summary><published>2011-01-11T16:48:00Z</published><updated>2011-01-11T16:48:00Z</updated><author><name>Atpking</name><uri>http://www.cnblogs.com/jicheng1014/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jicheng1014/archive/2011/01/12/1933402.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jicheng1014/archive/2011/01/12/1933402.html"/><content type="html">&lt;p&gt;其实很早的时候就想琢磨下Discuz!NT的一些东西,今天着重吧Discuz 的有关于配置的信息研究了下，拿出来与大家共同分享下&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Discuz!NT在web.config自定义了httpModule 模块去实现了IHttpModule&lt;/p&gt;  &lt;pre &gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;httpModules&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;add&lt;/span&gt; &lt;span &gt;type&lt;/span&gt;&lt;span &gt;="Discuz.Forum.HttpModule, Discuz.Forum"&lt;/span&gt; &lt;span &gt;name&lt;/span&gt;&lt;span &gt;="HttpModule"&lt;/span&gt; &lt;span &gt;/&amp;gt;&lt;/span&gt;&#xD;
&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;httpModules&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;pre &gt;这样的话，在程序启动的时候，则首先执行此处的HttpModule里的Init方法&lt;/pre&gt;&#xD;
&#xD;
&lt;div &gt;&#xD;
  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;void&lt;/span&gt; Init(HttpApplication context)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;OnlineUsers.ResetOnlineList();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;context.BeginRequest += &lt;span &gt;new&lt;/span&gt; EventHandler(ReUrl_BeginRequest);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (eventTimer == &lt;span &gt;null&lt;/span&gt; &amp;amp;&amp;amp; ScheduleConfigs.GetConfig().Enabled)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;p&gt;EventLogs.LogFileName = Utils.GetMapPath(&lt;span &gt;string&lt;/span&gt;.Format(&lt;span &gt;"{0}cache/scheduleeventfaildlog.config"&lt;/span&gt;,&lt;/p&gt;&lt;p&gt;BaseConfigs.GetForumPath));&lt;/p&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;EventManager.RootPath = Utils.GetMapPath(BaseConfigs.GetForumPath);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;p&gt;eventTimer = &lt;span &gt;new&lt;/span&gt; Timer(&lt;span &gt;new&lt;/span&gt; TimerCallback(ScheduledEventWorkCallback), context.Context, &lt;/p&gt;&lt;p&gt;60000, EventManager.TimerMinutesInterval * 60000);&lt;/p&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;context.Error += &lt;span &gt;new&lt;/span&gt; EventHandler(Application_OnError);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;&#xD;
&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;一行一行的讲解：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;OnlineUsers.ResetOnLineList首先将用户信息清零&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;context.BeginRequest += new EventHandler(ReUrl_BeginRequest) 这行代码指定地址请求处理的方法（ReUrl_BeginRequest这个方法是处理URL 地址的)&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;if(eventTimer == null &amp;amp;&amp;amp; ScheduleConfigs.GetConfig().Enabled) 判断是否配置开启了&amp;#8220;计划任务&amp;#8221;且计时器是否初始化&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;如果开启了&amp;#8220;计划任务&amp;#8221;且计时器未启动，则启用计划任务信息&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;最后context.Error += new EventHandler(Application_OnError) 为异常处理&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;这是上面的是大方向，今天就说一个地方:ScheduleConfigs.GetConfig()这句话，&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;也就是Discuz!NT 采用的配置文件方式&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Discuz!NT 将配置文件大部分的放入了web底下的config 目录里了，当然还有个最主要的DNT.Config放在外面&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101120048073197.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101120048098539.png" width="321" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;里面的结构大致如下所示&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101120048118374.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101120048145045.png" width="644" height="460" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;介绍下各个类的作用&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;ScheduleConfigs 是对外部公开的对象，它仅有两个功能，一是读出配置文件，二是存储配置文件信息，均无参数/&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;ScheduleConfigInfo 是一个领域模型，对应相应配置的config,为了统一方便处理，这里实现了仅作规定约束的IConfigInfo接口，此接口没有任何内容。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;实现ScheduleConfigs 中的功能主要依赖于&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;ScheduleConfigFileManager,其中用static 存储配置信息，由于是static型的，则只需要存储一次即可供全局共享&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;大概就是这样，后来我把Discuz!NT 的配置单独抽出来了，大概是这样的样子的&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101120048143899.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jicheng1014/201101/201101120048154357.png" width="244" height="93" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在这里我只向外部暴露DeclareDatertimeConfigs&amp;nbsp;&amp;nbsp; 这个类，其余的都为internal&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;部分代码如下&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&#xD;
  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; DeclareDateTimeConfigs&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// 获取配置类实例&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; DeclareDateTimeConfigInfo GetConfig()&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;return&lt;/span&gt; DeclareDateTimeConfigFileManager.LoadConfig();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 保存配置类实例&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;bool&lt;/span&gt; SaveConfig(DeclareDateTimeConfigInfo declareDateTimeConfigInfo)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;DeclareDateTimeConfigFileManager scfm = &lt;span &gt;new&lt;/span&gt; DeclareDateTimeConfigFileManager();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;DeclareDateTimeConfigFileManager.ConfigInfo = declareDateTimeConfigInfo;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; scfm.SaveConfig();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&#xD;
  &lt;pre &gt;&lt;span &gt;internal&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; DeclareDateTimeConfigFileManager:DefaultConfigFileManager&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;private&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; DeclareDateTimeConfigInfo m_configinfo;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 锁对象&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;private&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;object&lt;/span&gt; m_lockHelper = &lt;span &gt;new&lt;/span&gt; &lt;span &gt;object&lt;/span&gt;();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// 文件修改时间&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;private&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; DateTime m_fileoldchange;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 初始化文件修改时间和对象实例&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;static&lt;/span&gt; DeclareDateTimeConfigFileManager() {&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;m_fileoldchange = System.IO.File.GetLastWriteTime(ConfigFilePath);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;m_configinfo = (DeclareDateTimeConfigInfo)DefaultConfigFileManager.DeserializeInfo(ConfigFilePath, &lt;span &gt;typeof&lt;/span&gt;(DeclareDateTimeConfigInfo));&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;new&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; IConfigInfo ConfigInfo&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;get { &lt;span &gt;return&lt;/span&gt; m_configinfo; }&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;set { m_configinfo = (DeclareDateTimeConfigInfo)&lt;span &gt;value&lt;/span&gt;; }&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 配置文件所在路径&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; filename = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 获取配置文件所在路径&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;new&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; ConfigFilePath&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;get&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;if&lt;/span&gt; (filename == &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, &lt;span &gt;"Config\\DeclareDateTime.config"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;if&lt;/span&gt; (!File.Exists(filename))&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;throw&lt;/span&gt; &lt;span &gt;new&lt;/span&gt; Exception(&lt;span &gt;"发生错误: 虚拟目录或网站根目录下没有正确的DNT.config文件"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; filename;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// 加载配置类&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; DeclareDateTimeConfigInfo LoadConfig()&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;ConfigInfo = DefaultConfigFileManager.LoadConfig(&lt;span &gt;ref&lt;/span&gt; m_fileoldchange, ConfigFilePath, ConfigInfo);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; ConfigInfo &lt;span &gt;as&lt;/span&gt; DeclareDateTimeConfigInfo;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// 加载真正有效的配置类&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; DeclareDateTimeConfigInfo LoadRealConfig()&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;ConfigInfo = DefaultConfigFileManager.LoadConfig(&lt;span &gt;ref&lt;/span&gt; m_fileoldchange, ConfigFilePath, ConfigInfo, &lt;span &gt;false&lt;/span&gt;);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; ConfigInfo &lt;span &gt;as&lt;/span&gt; DeclareDateTimeConfigInfo;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// 保存配置&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;override&lt;/span&gt; &lt;span &gt;bool&lt;/span&gt; SaveConfig()&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;return&lt;/span&gt; &lt;span &gt;base&lt;/span&gt;.SaveConfig(ConfigFilePath, ConfigInfo);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&#xD;
  &lt;pre &gt;&lt;span &gt;internal&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; DefaultConfigFileManager&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 文件所在路径变量&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;private&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; m_configfilepath;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// 临时配置对象变量&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;private&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; IConfigInfo m_configinfo = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 锁对象&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;private&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;object&lt;/span&gt; m_lockHelper = &lt;span &gt;new&lt;/span&gt; &lt;span &gt;object&lt;/span&gt;();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 文件所在路径&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; ConfigFilePath&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;get { &lt;span &gt;return&lt;/span&gt; m_configfilepath; }&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;set { m_configfilepath = &lt;span &gt;value&lt;/span&gt;; }&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 临时配置对象&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; IConfigInfo ConfigInfo&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;get { &lt;span &gt;return&lt;/span&gt; m_configinfo; }&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;set { m_configinfo = &lt;span &gt;value&lt;/span&gt;; }&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// 加载(反序列化)指定对象类型的配置对象&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;param name="fileoldchange"&amp;gt;文件加载时间&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;param name="configFilePath"&amp;gt;配置文件所在路径&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;param name="configinfo"&amp;gt;相应的变量 注:该参数主要用于设置m_configinfo变量 和 获取类型.GetType()&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;protected&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; IConfigInfo LoadConfig(&lt;span &gt;ref&lt;/span&gt; DateTime fileoldchange, &lt;span &gt;string&lt;/span&gt; configFilePath, IConfigInfo configinfo)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; LoadConfig(&lt;span &gt;ref&lt;/span&gt; fileoldchange, configFilePath, configinfo, &lt;span &gt;true&lt;/span&gt;);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 加载(反序列化)指定对象类型的配置对象&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;param name="fileoldchange"&amp;gt;文件加载时间&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;param name="configFilePath"&amp;gt;配置文件所在路径(包括文件名)&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;param name="configinfo"&amp;gt;相应的变量 注:该参数主要用于设置m_configinfo变量 和 获取类型.GetType()&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;param name="checkTime"&amp;gt;是否检查并更新传递进来的"文件加载时间"变量&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;protected&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; IConfigInfo LoadConfig(&lt;span &gt;ref&lt;/span&gt; DateTime fileoldchange, &lt;span &gt;string&lt;/span&gt; configFilePath, IConfigInfo configinfo, &lt;span &gt;bool&lt;/span&gt; checkTime)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;lock&lt;/span&gt; (m_lockHelper)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;m_configfilepath = configFilePath;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;m_configinfo = configinfo;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;if&lt;/span&gt; (checkTime)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;DateTime m_filenewchange = System.IO.File.GetLastWriteTime(configFilePath);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;//当程序运行中config文件发生变化时则对config重新赋值&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (fileoldchange != m_filenewchange)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;fileoldchange = m_filenewchange;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;m_configinfo = DeserializeInfo(configFilePath, configinfo.GetType());&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;else&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;m_configinfo = DeserializeInfo(configFilePath, configinfo.GetType());&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;return&lt;/span&gt; m_configinfo;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 反序列化指定的类&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;param name="configfilepath"&amp;gt;config 文件的路径&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;param name="configtype"&amp;gt;相应的类型&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; IConfigInfo DeserializeInfo(&lt;span &gt;string&lt;/span&gt; configfilepath, Type configtype)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; (IConfigInfo)SerializationHelper.Load(configtype, configfilepath);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// 保存配置实例(虚方法需继承)&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;virtual&lt;/span&gt; &lt;span &gt;bool&lt;/span&gt; SaveConfig()&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;return&lt;/span&gt; &lt;span &gt;true&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 保存(序列化)指定路径下的配置文件&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;param name="configFilePath"&amp;gt;指定的配置文件所在的路径(包括文件名)&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;param name="configinfo"&amp;gt;被保存(序列化)的对象&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;bool&lt;/span&gt; SaveConfig(&lt;span &gt;string&lt;/span&gt; configFilePath, IConfigInfo configinfo)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; SerializationHelper.Save(configinfo, configFilePath);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div &gt;&#xD;
  &lt;pre &gt;&lt;span &gt;internal&lt;/span&gt; &lt;span &gt;class&lt;/span&gt; SerializationHelper&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;private&lt;/span&gt; SerializationHelper()&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{ }&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;private&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span &gt;int&lt;/span&gt;, XmlSerializer&amp;gt; serializer_dict = &lt;span &gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span &gt;int&lt;/span&gt;, XmlSerializer&amp;gt;();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; XmlSerializer GetSerializer(Type t)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;int&lt;/span&gt; type_hash = t.GetHashCode();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;if&lt;/span&gt; (!serializer_dict.ContainsKey(type_hash))&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;serializer_dict.Add(type_hash, &lt;span &gt;new&lt;/span&gt; XmlSerializer(t));&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; serializer_dict[type_hash];&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 反序列化&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;param name="type"&amp;gt;对象类型&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;param name="filename"&amp;gt;文件路径&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;object&lt;/span&gt; Load(Type type, &lt;span &gt;string&lt;/span&gt; filename)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;FileStream fs = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;try&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;// open the stream...&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;fs = &lt;span &gt;new&lt;/span&gt; FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;XmlSerializer serializer = &lt;span &gt;new&lt;/span&gt; XmlSerializer(type);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; serializer.Deserialize(fs);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;throw&lt;/span&gt; ex;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;finally&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (fs != &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;fs.Close();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// 序列化&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;param name="obj"&amp;gt;对象&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;param name="filename"&amp;gt;文件路径&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;bool&lt;/span&gt; Save(&lt;span &gt;object&lt;/span&gt; obj, &lt;span &gt;string&lt;/span&gt; filename)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;bool&lt;/span&gt; success = &lt;span &gt;false&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;FileStream fs = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;// serialize it...&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;try&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;fs = &lt;span &gt;new&lt;/span&gt; FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;XmlSerializer serializer = &lt;span &gt;new&lt;/span&gt; XmlSerializer(obj.GetType());&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;serializer.Serialize(fs, obj);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;success = &lt;span &gt;true&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;throw&lt;/span&gt; ex;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;finally&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (fs != &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;fs.Close();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;return&lt;/span&gt; success;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// xml序列化成字符串&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;/// &amp;lt;param name="obj"&amp;gt;对象&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;/// &amp;lt;returns&amp;gt;xml字符串&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;string&lt;/span&gt; Serialize(&lt;span &gt;object&lt;/span&gt; obj)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;string&lt;/span&gt; returnStr = &lt;span &gt;""&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;XmlSerializer serializer = GetSerializer(obj.GetType());&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;MemoryStream ms = &lt;span &gt;new&lt;/span&gt; MemoryStream();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;XmlTextWriter xtw = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;StreamReader sr = &lt;span &gt;null&lt;/span&gt;;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;try&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;xtw = &lt;span &gt;new&lt;/span&gt; System.Xml.XmlTextWriter(ms, Encoding.UTF8);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;xtw.Formatting = System.Xml.Formatting.Indented;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;serializer.Serialize(xtw, obj);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;ms.Seek(0, SeekOrigin.Begin);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;sr = &lt;span &gt;new&lt;/span&gt; StreamReader(ms);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;returnStr = sr.ReadToEnd();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;throw&lt;/span&gt; ex;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;finally&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (xtw != &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;xtw.Close();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;if&lt;/span&gt; (sr != &lt;span &gt;null&lt;/span&gt;)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;sr.Close();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;ms.Close();&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; returnStr;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;public&lt;/span&gt; &lt;span &gt;static&lt;/span&gt; &lt;span &gt;object&lt;/span&gt; DeSerialize(Type type, &lt;span &gt;string&lt;/span&gt; s)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;byte&lt;/span&gt;[] b = System.Text.Encoding.UTF8.GetBytes(s);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;&lt;span &gt;try&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;XmlSerializer serializer = GetSerializer(type);&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;return&lt;/span&gt; serializer.Deserialize(&lt;span &gt;new&lt;/span&gt; MemoryStream(b));&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;{&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;&lt;span &gt;throw&lt;/span&gt; ex;&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre &gt;}&lt;/pre&gt;&#xD;
&#xD;
  &lt;pre&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;style type="text/css"&gt;&#xD;
.csharpcode, .csharpcode pre&#xD;
{&#xD;
	font-size: small;&#xD;
	color: black;&#xD;
	font-family: consolas, "Courier New", courier, monospace;&#xD;
	background-color: #ffffff;&#xD;
	/*white-space: pre;*/&#xD;
}&#xD;
.csharpcode pre { margin: 0em; }&#xD;
.csharpcode .rem { color: #008000; }&#xD;
.csharpcode .kwrd { color: #0000ff; }&#xD;
.csharpcode .str { color: #006080; }&#xD;
.csharpcode .op { color: #0000c0; }&#xD;
.csharpcode .preproc { color: #cc6633; }&#xD;
.csharpcode .asp { background-color: #ffff00; }&#xD;
.csharpcode .html { color: #800000; }&#xD;
.csharpcode .attr { color: #ff0000; }&#xD;
.csharpcode .alt &#xD;
{&#xD;
	background-color: #f4f4f4;&#xD;
	width: 100%;&#xD;
	margin: 0em;&#xD;
}&#xD;
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&#xD;
&#xD;
&lt;p&gt;使用时候非常方便，使用下列语句&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;var config = DeclareDateTimeConfigs.GetConfig();&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;即可得到配置信息&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;存储配置信息也很简单&amp;nbsp;&amp;nbsp; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;DeclareDateTimeConfigs.SaveConfig(config);&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;因为此处是static&amp;nbsp;&amp;nbsp; 所以可以不用考虑缓存的问题&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jicheng1014/aggbug/1933402.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jicheng1014/archive/2011/01/12/1933402.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
