以前做过一次Socket编程,在学校里要求做一个聊天功能
传输是拼接字符串,以流的形式进行传输,字符串格式为:命令|传给谁|消息内容
现在自己想做个小东西,但是传输内容不仅仅是这么简单了
假设有一个Student对象s,一个Teacher对象t,我如何封装成数据包进行传输呢?
或许大家会说要用到序列化和反序列化,恩恩,这个我也有想过
不过因为没做过这样的功能,
麻烦大家给我下思路,或者能给我篇文章让我看看
能贴出代码事例就更好了
谢谢各位了~

解决方案 »

  1.   

    这个也一样啊 都转换成一种格式 比如说byte数组 然后再结尾也加上个|区别开
      

  2.   


    //本程序演示了最简单的序列化 和反序列化 ,将对象存储到本地文件中 ,
    //对象序列化的另一个目的是网络传输信息
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Xml.Serialization;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Data;
    namespace 序列化_啊
    {    class Program
        {
            static void Main(string[] args)
            {
                //创建文件a.dat
                FileStream f = new FileStream("a.dat", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                //创建类的实例t
                test t = new test();
                //给属性赋值
                t.A = "hello";
                t.N = 5;            //二进制序列化
                IFormatter format = new BinaryFormatter();
                format.Serialize(f, t);
                f.Close();            //读取文件
                f = new FileStream("a.dat", FileMode.Open, FileAccess.Read);
                test m = (test)format.Deserialize(f);
                Console.WriteLine(m.A);
                Console.WriteLine(m.N);
                f.Close();
                
                Console.Read();
            }       [Serializable]//可序列化标记
            class test
            {
                int n = 0;
                string a = null;
                [NonSerialized]//不可序列化标记
                int b = 10;
                public int N
                {
                    set
                    {
                        n = value;
                    }
                    get
                    {
                        return n;
                    }
                }
                public string A
                {
                    set
                    {
                        a = value;
                    }
                    get
                    {
                        return a;
                    }
                }
            }
        }
    }http://blog.csdn.net/xuanhun/archive/2008/07/25/2711455.aspx
      

  3.   

    LS的,序列化和反序列化我会,我再说下我的需求吧
    假设有一个Student对象s,一个Teacher对象t
    我如何把2个对象通过服务器发送到客户端,并进行分析,得到最初的s和t
      

  4.   

    // 用来序列化对象的类
    public class Serialize
    {
                    public static byte[] serialize(object obj)
                    {
                            IFormatter formatter = new BinaryFormatter();
                            MemoryStream ms = new MemoryStream();
                            formatter.Serialize(ms, obj);
                            byte[] tmp = ms.ToArray();
                            ms.Close();
                            return tmp;
                    }
    }
    byte[] sends = Serialize.serialize(obj);
    socket.send(sends); 
      

  5.   

    http://topic.csdn.net/t/20041125/11/3586852.html
    http://topic.csdn.net/t/20020618/17/813223.html
      

  6.   

    LS的,额,我似乎有点笨,您的代码我是看懂了,但是我还想问一下
    这只是一个对象序列化之后转成了byte数组,如何将多个对象序列化后的byte数组合并进行传输?
      

  7.   

    4楼的,额,我似乎有点笨,您的代码我是看懂了,但是我还想问一下 
    这只是一个对象序列化之后转成了byte数组,如何将多个对象序列化后的byte数组合并进行传输?
      

  8.   


    //类对像的话用好像转化成object
    object
      

  9.   

    我给你的那个链接里有例子的,这样应该看得懂的:[Serializable]   
      public   class   MyClass   
      {   
      public   string   MyClassMember   =   "Hello   World";   
      }   
        
      public   void   Send(Socket   socket)   
      {   
      MyClass   obj   =   new   MyClass();   
        
      BinaryFormatter   bf   =   new   BinaryFormatter();   
        
      MemoryStream   ms   =   new   MemoryStream();   
        
      bf.Serialize(ms,   obj);   
        
      byte[]   data   =   new   byte[1024];   
        
      while(   ms.Read(data,   0,   1024)>0   )   
      {   
      sk.Send(data);   
      }   
      }   
        
      public   void   Recieve(Socket   socket)   
      {   
      BinaryFormatter   bf   =   new   BinaryFormatter();   
        
      byte[]   data   =   new   byte[1024];   
        
      MemoryStream   ms   =   new   MemoryStream();   
        
      while(   sk.Receive(data)>0   )   
      {   
      ms.Write(data,   0,   1024);   
      }   
        
      MyClass   obj   =   bf.Deserialize(ms)   as   MyClass;   
      }
      

  10.   

    对象一个个的发送;
    通过反射分析得出object是哪个对象。
    楼下的是不是这样啊
      

  11.   

    对象一个个的发送;
    通过反射分析得出object是哪个对象。
    楼下的是不是这样啊
      

  12.   

    如果你想很方便的传输对象,那么有两种更好的方法,1. .NET Remoting 2. WCF
      

  13.   

    楼主会序列化和反序列化那还有什么问题呢?如果传送的是T对象,你只要反序列化后得到的object 进行一下 if(object is T)比较不就可以知道传过来的对象是T还是S了吗?至于T和S里面是什么样的结构就要你自己写了。另外一点就是,接收的那一端对BYTE数组好像要设得足够大,否足会因为接收不完全而没办法转成OBJECT对象。自己多摸索一下