1

我有一个包含 C#/VB.NET 的 n 层业务应用程序项目,并且在获取更新方法以在层之间进行通信时遇到问题。在最接近我的数据库的数据层中,我有一个 GetByID() 方法,该方法根据他们在数据库中的 ID 查找员工,并将他们的头衔、名字等以及整个实体放入字典中(序列化)。

在下一层(业务用户)中,我尝试将其私有成员设置为业务用户 GetByID() 方法的结果,该方法调用数据层 GetByID() 方法。在这里我试图设置我的私人成员

_entity = (byte[])retDict["entity"];

这给了我错误,因为 _entity 是一个类型,所以不能将 byte[] 隐式键入到 System.Type。

在 VB 中完成的表示层,通过 listview 选择值传递一个employeeID,然后再向下传递到用户层和数据层。

这是 EmployeeBusinessData 层 GetByID() 代码:

public byte[] GetByID(int empid)
    {
        Dictionary<string, Object> retDict = new Dictionary<string, Object>();

        try
        {
            HelpDeskDBEntities dbContext = new HelpDeskDBEntities();
            dbContext.Configuration.ProxyCreationEnabled = false;
            Employee EmployeeEntity = dbContext.Employees.FirstOrDefault(emp => emp.EmployeeID == empid);

            if (EmployeeEntity != null)
            {
                retDict["title"] = EmployeeEntity.Title;
                retDict["firstname"] = EmployeeEntity.FirstName;
                retDict["lastname"] = EmployeeEntity.LastName;
                retDict["phoneno"] = EmployeeEntity.PhoneNo;
                retDict["email"] = EmployeeEntity.Email;
                retDict["departmentid"] = EmployeeEntity.DepartmentID;
                retDict["employeeid"] = EmployeeEntity.EmployeeID;
                retDict["entity"] = Serializer(EmployeeEntity, true);
            }
            else
            {
                retDict["error"] = "Employee not found!";
            }
        }
        catch (Exception ex)
        {
            ErrorRoutine(ex, "EmployeeBusinessData", "GetByID");
        }
        return Serializer(retDict);
    }

EmployeeBusinessUser 层 GetById():

public byte[] GetByID(int empid)
    {
        Dictionary<string, Object> retDict = new Dictionary<string, object>();
        try
        {
            EmployeeBusinessData empData = new EmployeeBusinessData();
            retDict = (Dictionary<string, Object>)Deserializer(empData.GetByID(empid));

            _employeeID = Convert.ToInt32(retDict["employeeid"]);
            _title = Convert.ToString(retDict["title"]);
            _firstName = Convert.ToString(retDict["firstname"]);
            _lastName = Convert.ToString(retDict["lastname"]);
            _phoneNo = Convert.ToString(retDict["phoneno"]);
            _email = Convert.ToString(retDict["email"]);
            _departmentID = Convert.ToInt32(retDict["departmentid"]);
            _entity = (byte[])retDict["entity"];

        }
        catch (Exception ex)
        {
            ErrorRoutine(ex, "EmployeeUserData", "GetByID");
        }
        return Serializer(retDict);
    }

这也是 Serializer 方法代码,在两个类 .dll 中都是相同的:

public static byte[] Serializer(Object inObject, bool bIsEntity = false)
    {
        byte[] ByteArrayObject;

        if (bIsEntity) //If the entity uses DataContractSerializer
        {
            MemoryStream strm = new MemoryStream();
            var serializer = new DataContractSerializer(inObject.GetType());
            serializer.WriteObject(strm, inObject);
            ByteArrayObject = strm.ToArray();
        }
        else
        {
            BinaryFormatter frm = new BinaryFormatter();
            MemoryStream strm = new MemoryStream();
            frm.Serialize(strm, inObject);
            ByteArrayObject = strm.ToArray();
        }

        return ByteArrayObject;
    }

private Type _entity;

解串器的两种不同类型:

 public static Object Deserializer(byte[] ByteArrayIn, Type entityType)
    {
        MemoryStream stream = new MemoryStream(ByteArrayIn);
        DataContractSerializer ser = new DataContractSerializer(entityType);
        Object returnObject = ser.ReadObject(stream);
        return returnObject;
    }
public static Object Deserializer(byte[] ByteArrayIn)
    {
        BinaryFormatter frm = new BinaryFormatter();
        MemoryStream strm = new MemoryStream(ByteArrayIn);
        Object returnObject = frm.Deserialize(strm);
        return returnObject;
    }

如何让 retDict["entity"] 转换为一个字节,以便将其分配给 _entity?

4

1 回答 1

2

这是你的问题:

private Type _entity;

您可能想要一个 Employee 对象,如下所示:

private Employee _entity;

或者,如果您想要一个可以保存任何类型的对象(或实体)的变量,请使用以下object类型:

private object _entity;

.NET 中的AType是表示类类型的类,而不是类本身。

因此,如果我有这样的课程:

public class Person
{
}

我可以将它存储在 Person 变量中:

Person somePerson = new Person();

或者在对象变量中:

object someObject = new Person();

但我只能将对象的类型存储在Type变量中:

Type someType = typeof(Person);

或者,如果您有一个对象的实例,您可以按如下方式获取其类型:

Person somePerson = new Person();
Type typeOfSomePerson = somePerson.GetType();

但很可能你根本不想要这种类型。

编辑:

我注意到您在问题中没有反序列化两次。您首先序列化实体,然后分别序列化其字段。我不确定您为什么要对所有内容进行两次序列化。但至少你需要反序列化两次。

所以改变这个:

_entity = (byte[])retDict["entity"];

对此:

_entity = (Employee)Deserialize((byte[])retDict["entity"], typeof(Employee));

这实际上是在说,“从字典中检索 Employee 的序列化字节,将字节反序列化为 Employee 实例,并将其转换为 Employee,因为该方法的返回类型是对象。”

但就像我说的,你似乎在每个领域都做了两次。您应该只需要序列化实体本身一次,然后再次反序列化实体。除非我在你的逻辑中遗漏了什么。

于 2013-10-20T06:59:18.820 回答