通过套接字进行 C# 序列化,一个类正在序列化,另一个类没有

标签 c# sockets serialization stream formatter

我正在尝试用 C# 为一个学校项目制作一个客户端-服务器应用程序 我的问题是一个类序列化正常并通过套接字发送,而另一个类则没有序列化,我无法弄清楚。

Employee 类(还有 Bonus)正在序列化,但是当我尝试传递给 一个 Transfer 实例的格式化者

formatter.Serialize(stream, transferObj);

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

发送到服务器()

 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);

员工类

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
}
}

最佳答案

它不允许您这样做,因为您使用固定长度的字节数组显式初始化了 MemoryStream。看到这个:http://weblogs.asp.net/ashicmahtab/archive/2008/08/25/memorystream-not-expandable-invalid-operation-exception.aspx

尝试这样的事情:

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


            formatter.Serialize(stream, e);
            byte[] buffer = ((MemoryStream)stream).ToArray();

关于通过套接字进行 C# 序列化,一个类正在序列化,另一个类没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5780883/

相关文章:

c# - 列表的深拷贝

c - 在使用前将诸如 sockaddr_in、sockaddr_in6 和 addrinfo 之类的结构归零时,哪个是正确的 : memset, 初始化程序还是两者之一?

python - 使用 pyspark SparseVectors 解析所有零稀疏向量

java - 是否可以使用 XStream 将对象字段隐式添加到 XML 中?

serialization - Celery 结果后端在结果列中存储编码字符串

c# - 如何从控制台应用程序将文件上传到 ASP.NET MVC

c# - 使用 LINQ 组合不同类型的集合

c# - 十进制值检查是否为零

linux - tcp 接收窗口更新

c - 检测连接