无法将System.Type强制转换为byte []

时间:2013-10-20 06:23:37

标签: c# .net

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

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

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

这给了我错误,不能隐式地将byte []类型化为System.Type,因为_entity是一个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方法代码,在类.dlls中都是一样的:

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?

1 个答案:

答案 0 :(得分:2)

这是你的问题:

private Type _entity;

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

private Employee _entity;

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

private object _entity;

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

所以如果我有这样的课程:

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,因为该方法的返回类型是object。”

但就像我说的那样,你似乎每次都在做两次。您只需要对实体本身进行一次序列化,然后再将该实体反序列化。除非你的逻辑中缺少某些东西。