2011-04-25 34 views
1

即时通讯我正在尝试为一个学校项目在C#中的客户端 - 服务器应用程序# 我的问题是,一个类获取序列化好,并通过套接字发送,另一个不是,我不知道。C#通过套接字序列化,一类正在序列化另一个没有

Employee类(和奖金)越来越序列化,但是当我试图传递给 所述格式化一个传输实例

formatter.Serialize(stream, transferObj); 

它抛出异常:NotSupportedException异常 与消息:内存流不可扩展。

sendToServer()

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

     System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse("127.0.0.1"); 
     System.Net.IPEndPoint remoteEP = new IPEndPoint(ipAdd, 6666); 
     socket.Connect("127.0.0.1", 6666); 


     Transfer t = new Transfer(); 

     Employee e = new Employee(); 
     Bonus b = new Bonus(); b.setAmmount(234); b.setDescription("xxxx"); 
     e.getBonuses().Add(b); 

     byte[] buffer = new byte[1000]; 
     System.Console.WriteLine("client started"); 

      IFormatter formatter = new BinaryFormatter(); 
      Stream stream = new MemoryStream(buffer); 


      formatter.Serialize(stream, e); 
      // Employee and Bonus are serialized but not Transfer 
      stream.Flush(); 

      socket.Send(buffer,buffer.Length,0); 

Employee类

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Permissions; 
using System.Runtime.Serialization; 

namespace Entity 
{ 
[Serializable] 
public class Employee : ISerializable 
{ 

    private int id; 
    private long version; 
    private String username; 
    private String password; 
    private String role; 
    private String name; 
    private String surname; 
    private long salary; 
    private DateTime experience; 
    private DateTime birthDate; 
    private String sex; 
    private List<Bonus> bonuses; 

    public Employee() { 
     bonuses = new List<Bonus>(); 
    } 

     protected Employee(SerializationInfo info, StreamingContext context) 
    { 
     id = info.GetInt32("id"); 
     version = info.GetInt32("version"); 
     username = info.GetString("username"); 
     password = info.GetString("password"); 
     role = info.GetString("role"); 
     name = info.GetString("name"); 
     surname = info.GetString("surname"); 
     salary = info.GetInt32("salary"); 
     experience = (DateTime) info.GetValue("exp", typeof(DateTime)); 
     birthDate = (DateTime)info.GetValue("birth", typeof(DateTime)); 
     sex = info.GetString("sex"); 
     bonuses = (List<Bonus>) info.GetValue("bonuses", typeof(List<Bonus>)); 

    } 





    public int getId() 
    { 
     return id; 
    } 
    public void setId(int id) 
    { 
     this.id = id; 
    } 
    public String getName() 
    { 
     return name; 
    } 
    public void setName(String name) 
    { 
     this.name = name; 
    } 
    public String getSurname() 
    { 
     return surname; 
    } 
    public void setSurname(String surname) 
    { 
     this.surname = surname; 
    } 
    public long getSalary() 
    { 
     return salary; 
    } 
    public void setSalary(long salary) 
    { 
     this.salary = salary; 
    } 
    public DateTime getExperience() 
    { 
     return experience; 
    } 
    public void setExperience(DateTime experience) 
    { 
     this.experience = experience; 
    } 
    public DateTime getBirthDate() 
    { 
     return birthDate; 
    } 
    public void setBirthDate(DateTime birthDate) 
    { 
     this.birthDate = birthDate; 
    } 
    public List<Bonus> getBonuses() 
    { 
     return bonuses; 
    } 
    public void setBonuses(List<Bonus> bonuses) 
    { 
     this.bonuses = bonuses; 
    } 


    public override string ToString() 
    { 
     return name + " " + surname; 
    } 

    public override int GetHashCode() 
    { 
     int prime = 31; 
     int result = 1; 
     result = prime * result + id; 
     return result; 
    } 

    public override bool Equals(System.Object obj) 
    { 
     // If parameter is null return false. 
     if (obj == null) 
     { 
      return false; 
     } 

     // If parameter cannot be cast to Point return false. 
     Employee p = obj as Employee; 
     if ((System.Object)p == null) 
     { 
      return false; 
     } 

     // Return true if the fields match: 
     return id == p.id; 
    } 

    public void setSex(String sex) 
    { 
     this.sex = sex; 
    } 
    public String getSex() 
    { 
     return sex; 
    } 
    public long getVersion() 
    { 
     return version; 
    } 
    public void setVersion(long version) 
    { 
     this.version = version; 
    } 
    public String getUsername() 
    { 
     return username; 
    } 
    public void setUsername(String username) 
    { 
     this.username = username; 
    } 
    public String getPassword() 
    { 
     return password; 
    } 
    public void setPassword(String password) 
    { 
     this.password = password; 
    } 
    public String getRole() 
    { 
     return role; 
    } 
    public void setRole(String role) 
    { 
     this.role = role; 
    } 

    #region ISerializable Members 
    [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] 
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("id", id); 
     info.AddValue("version", version); 
     info.AddValue("username", username); 
     info.AddValue("password", password); 
     info.AddValue("role", role); 
     info.AddValue("name", name); 
     info.AddValue("surname", surname); 
     info.AddValue("salary", salary); 
     info.AddValue("exp", experience); 
     info.AddValue("birth", birthDate); 
     info.AddValue("sex", sex); 
     info.AddValue("bonuses", bonuses); 
    } 

    #endregion 
} 

} 

转让类

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Permissions; 
using System.Runtime.Serialization; 


namespace Entity 
{ 
[Serializable] 
public class Transfer : ISerializable 
{ 
    private Employee employee; 
    private String method; 
    private String message; 
    private List<Employee> queriedEmployees; 

    public Transfer() { 
     queriedEmployees = new List<Employee>(); 
    } 

    protected Transfer(SerializationInfo info, StreamingContext context) 
    { 

     employee = (Employee) info.GetValue("employee", typeof(Employee)); 
     method = info.GetString("method"); 
     message = info.GetString("message"); 
     queriedEmployees = (List<Employee>) info.GetValue("qe", typeof(List<Employee>)); 
    } 






    public Employee getEmployee() 
    { 
     return employee; 
    } 

    public String getMethod() 
    { 
     return method; 
    } 

    public String getMessage() 
    { 
     return message; 
    } 

    public List<Employee> getQueriedEmployees() 
    { 
     return queriedEmployees; 
    } 

    public void setEmployee(Employee e) 
    { 
     employee = e; 
    } 

    public void setMessage(String mes) 
    { 
     message = mes; 
    } 

    public void setMethod(String meth) 
    { 
     method = meth; 
    } 

    public void setQueriedEmployees(List<Employee> elist) 
    { 
     queriedEmployees = elist; 
    } 



    #region ISerializable Members 
    [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] 
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("employee", employee); 
     info.AddValue("method", method); 
     info.AddValue("message", message); 
     info.AddValue("qe", queriedEmployees); 
    } 

    #endregion 
} 
} 
+0

除了答案,注意发送整个缓冲区是不正确;您应该只使用缓冲区的* used *部分 - 即检查内存流的长度。还要注意,大多数情况下,您可以直接写入输出流,而在中间需要一个仿真缓冲区。 – 2011-04-25 17:37:04

回答

-2

设置一个较大的缓冲区会让我连载传输类

4

通过提供一个缓冲区来你将它固定到大小的MemoryStream构造函数。如果你只是使用默认的构造函数,那么流应该可扩展到任何需要的大小。

Stream stream = new MemoryStream(); 

this blog entry