----五、序列化对象如何在网上传送?有简单的代码示例吗?
只要你的对象支持序列化可以用下面的方法实现序列化与反序列化
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;
}

解决方案 »

  1.   

    windows基于消息
    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了
      

  2.   

    有篇介绍的很好的文章,但是太长,没有办法贴给你。
    留下email吧
      

  3.   

    psn(psn)
    你能否把第一、二个问题回答得更详细点?普通概念我都查得到啊,我就是想知道一些浅原理,好运用在实践当中
      

  4.   

    BeginXXX() CLR用delegate封装XXX()函数后,放入县城池作业队列后就返回了。
    当前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);
    可以达到同样效果,性能差多了
      

  5.   

    一、
    那Done.Reset()、Done.Set()这些方法,它们都是干什么用的,到底哪两个是相反的方法?MSDN上说的不是很清楚。
        在程序里各位置上加上这几条语句的原因是什么?如果分别去掉会有什么后果?线程组塞后到底用什么方法激活,Reset()还是Set()?很糊涂。
    二、
    Done.Set();//设为终止
    mySocket=(Socket)ar.AsyncState; //获取状态
    handler=mySocket.EndAccept(ar);   //异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信,获取结果第一行中“终止”表示线程是什么状态?
    第二行中“状态”是什么意思?
    第三行是否会引起该线程阻塞?
      

  6.   

    Done是什么?我不知道
    状态仅仅是这个属性名称,用来保存数据的
    BeginXXX()最后一个参数就是这个state,没意义,用来保存数据,当工作县城完成,回调callback函数时,你可以佣这个state对象中保存的数据,简单的说,就是给callback函数传数据,这是县城间传递数据的简单形势。
    EndAccept(),前2次说明了异步的实现机制
      

  7.   

    private static ManualResetEvent Done=new ManualResetEvent(false);
      

  8.   

    我也需要这方面的知识,可msdn越看越糊涂,也给我发篇文章吧,我的email是[email protected],谢谢