最近在用vs2005中的socket编一个网络间计算机基本数据通信的程序,我把要发的数据存在一个Hashtable(散列表)里,然后串行化到一个流,再从流中读出字节数组,然后用socket发送,接收端接收到后反串行化回散列表,再从中读出数据。但有个问题,我从流(filestream)中用read方法并不能把流中的东西读到字节数组中,很奇怪。我先把这个文件流存成一个磁盘文件,然后再从磁盘文件中读出,然后同样用read方法就可以读到字节数组里了,但我不可能每次发数据还要存盘,这太不合理了。各位高手又没有好办法解决,或者有什么别的办法可以不通过流直接把一个散列表串行化到一个字节数组?谢谢!

解决方案 »

  1.   

    flush没有用啊!
    看一下我的程序吧(简化的)
    FileStream dataLengthStream = File.Open("f:\\bb.bin", FileMode.OpenOrCreate, FileAccess.ReadWrite );//声明一个文件流
    formatter.Serialize(dataLengthStream, dataLength);//把dataLength串行化到文件流,dataLength是一个long型变量
    byte[] b = new byte[58];//long型变量二进制串行化后为58字节
    int k = dataLengthStream.Read(b, 0, (int)dataLengthStream.Length);//?????????出问题的地方,read不能正常执行,k总等于0;
    如果程序改成:
    FileStream dataLengthStream = File.Open("f:\\bb.bin", FileMode.OpenOrCreate, FileAccess.ReadWrite );
    formatter.Serialize(dataLengthStream, dataLength);FileStream.Close();//注意这两行,将流关闭后再打开,指向的是同样的数据,都是f:\bb.bin,这样做后,再下面的read就可以读到正确的数据
    dataLengthStream = File.Open("f:\\bb.bin", FileMode.Open );//我就不知道是怎么回事了????????????byte[] b = new byte[58];
    int k = dataLengthStream.Read(b, 0, (int)dataLengthStream.Length);
      

  2.   

    我明白了,不是流的问题,是我在串行化后,文件流的指针停留在流的末尾,再读的时候就什么都读不出来了,用seek方法把指针定回到开头就好了。谢谢各位大侠了。
      

  3.   

    最好不要输入到file,留在内存中就可以了。
    按你的需求,似乎没有保存在文件中的必要。
    牺牲内存而获取速度,应该是更好的选择。