----五、序列化对象如何在网上传送?有简单的代码示例吗?
只要你的对象支持序列化可以用下面的方法实现序列化与反序列化
public static byte[] SerializeObject(object pObj)
{
if(pObj == null)
return null;
System.IO.MemoryStream _memory = new System.IO.MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(_memory,pObj);
_memory.Position = 0;
byte[] read = new byte[_memory.Length];
_memory.Read(read,0,read.Length);
_memory.Close();
return read;
}
public static void SerializeObject(object pObj,string pFileName)
{
System.IO.FileStream stream = System.IO.File.Open(pFileName,System.IO.FileMode.Create,System.IO.FileAccess.Write);
byte[] bytes = SerializeObject(pObj);
stream.Write(bytes,0,bytes.Length);
stream.Flush();
stream.Close();
}
public static object DeserializeObject(string pFileName)
{
System.IO.FileStream stream = System.IO.File.Open(pFileName,System.IO.FileMode.Open,System.IO.FileAccess.Read);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes,0,bytes.Length);
stream.Close();
return DeserializeObject(bytes);
}
/// <summary>
/// 把字节反序列化成相应的对象
/// </summary>
/// <param name="pBytes">字节流</param>
/// <returns>object</returns>
public static object DeserializeObject(byte[] pBytes)
{
object _newOjb = null;
if(pBytes == null)
return _newOjb;
System.IO.MemoryStream _memory = new System.IO.MemoryStream(pBytes);
_memory.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
_newOjb = formatter.Deserialize(_memory);
_memory.Close();
return _newOjb;
}
只要你的对象支持序列化可以用下面的方法实现序列化与反序列化
public static byte[] SerializeObject(object pObj)
{
if(pObj == null)
return null;
System.IO.MemoryStream _memory = new System.IO.MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(_memory,pObj);
_memory.Position = 0;
byte[] read = new byte[_memory.Length];
_memory.Read(read,0,read.Length);
_memory.Close();
return read;
}
public static void SerializeObject(object pObj,string pFileName)
{
System.IO.FileStream stream = System.IO.File.Open(pFileName,System.IO.FileMode.Create,System.IO.FileAccess.Write);
byte[] bytes = SerializeObject(pObj);
stream.Write(bytes,0,bytes.Length);
stream.Flush();
stream.Close();
}
public static object DeserializeObject(string pFileName)
{
System.IO.FileStream stream = System.IO.File.Open(pFileName,System.IO.FileMode.Open,System.IO.FileAccess.Read);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes,0,bytes.Length);
stream.Close();
return DeserializeObject(bytes);
}
/// <summary>
/// 把字节反序列化成相应的对象
/// </summary>
/// <param name="pBytes">字节流</param>
/// <returns>object</returns>
public static object DeserializeObject(byte[] pBytes)
{
object _newOjb = null;
if(pBytes == null)
return _newOjb;
System.IO.MemoryStream _memory = new System.IO.MemoryStream(pBytes);
_memory.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
_newOjb = formatter.Deserialize(_memory);
_memory.Close();
return _newOjb;
}
WaitOne() 当前thread挂起等待下一个信号后继续
AsyncState用在给delegate方法传递数据用,对方法调用无关,你可以将需要的信息做成类
EndAccept()是获取Accept()的返回值
.NET中 BeginXXX()与EndXXX()成对出现,用于异步方法的异步调用,我写个流程
BeginXXX() --> queue --> Thread Poll --> wait for idle thread -->thread invoke -->AsyncCallBack invoke --> EndXXX() --> result harvested --> thread call over
所以BeginXXX()就是多thread
Reset() 与 Set()没映像。
用户吊线只能自己定时扫描了
searialize用remoting的话实现ISearialize或者加个同名属性
流的话用Formatter了
留下email吧
你能否把第一、二个问题回答得更详细点?普通概念我都查得到啊,我就是想知道一些浅原理,好运用在实践当中
当前thread继续执行,在你的代码里直接到了Receive(),你这个receive()是同步操作,thread应该等在这里直到有数据接收,因为你地accept是异步的,这里mySocket可能会不正确(猜想是客户socket),用waitone()的流程和前面的异步的流程有点差异,差别在于工作thread完成后会设置AsyncResult.IsCompleted 同时对AsyncWaitHandle发出signal。WaitOne()捕捉这个signal. 如果你用while (!ar.IsCompleted) //IAsyncResult ar
System.Threading.Thread.Sleep(1);
可以达到同样效果,性能差多了
那Done.Reset()、Done.Set()这些方法,它们都是干什么用的,到底哪两个是相反的方法?MSDN上说的不是很清楚。
在程序里各位置上加上这几条语句的原因是什么?如果分别去掉会有什么后果?线程组塞后到底用什么方法激活,Reset()还是Set()?很糊涂。
二、
Done.Set();//设为终止
mySocket=(Socket)ar.AsyncState; //获取状态
handler=mySocket.EndAccept(ar); //异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信,获取结果第一行中“终止”表示线程是什么状态?
第二行中“状态”是什么意思?
第三行是否会引起该线程阻塞?
状态仅仅是这个属性名称,用来保存数据的
BeginXXX()最后一个参数就是这个state,没意义,用来保存数据,当工作县城完成,回调callback函数时,你可以佣这个state对象中保存的数据,简单的说,就是给callback函数传数据,这是县城间传递数据的简单形势。
EndAccept(),前2次说明了异步的实现机制