C# 无法强制转换系统。请将类型转换为字节[]
我有一个包含C#/VB.NET的n层业务应用程序项目,在获取层间通信的更新方法时遇到问题。在离数据库最近的数据层中,我有一个GetByID()方法,该方法基于数据库中的员工ID查找员工,并将其标题、名字等以及实体作为一个整体(序列化)放在字典中 在下一层(businessuser),我尝试将其私有成员设置为businessuser GetByID()方法的结果,该方法调用数据层GetByID()方法。在这里,我正试图设置我的私人会员C# 无法强制转换系统。请将类型转换为字节[],c#,.net,C#,.net,我有一个包含C#/VB.NET的n层业务应用程序项目,在获取层间通信的更新方法时遇到问题。在离数据库最近的数据层中,我有一个GetByID()方法,该方法基于数据库中的员工ID查找员工,并将其标题、名字等以及实体作为一个整体(序列化)放在字典中 在下一层(businessuser),我尝试将其私有成员设置为businessuser GetByID()方法的结果,该方法调用数据层GetByID()方法。在这里,我正试图设置我的私人会员 _entity = (byte[])retDict["enti
_entity = (byte[])retDict["entity"];
这给了我一个错误,即无法将byte[]隐式键入System.type,因为_entity是一个类型
在VB中完成的表示层通过listview选择值传递employeeID,然后依次传递到用户层和数据层
以下是EmployeeBusinessData层GetByID()代码:
反序列化程序有两种不同类型:
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?这是您的问题:
private Type _entity;
您可能需要一个Employee对象,如下所示:
private Employee _entity;
或者,如果您想要一个可以容纳任何类型对象(或实体)的变量,请使用对象
类型:
private object _entity;
NET中的Type
是表示类类型的类,而不是类本身
如果我有一个这样的班:
public class Person
{
}
我可以将其存储在Person变量中:
Person somePerson = new Person();
object someObject = new Person();
Type someType = typeof(Person);
或在对象变量中:
Person somePerson = new Person();
object someObject = new Person();
Type someType = typeof(Person);
但我只能将对象的类型存储在type
变量中:
Person somePerson = new Person();
object someObject = new Person();
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。”
但就像我说的,似乎每个领域你都做了两次。您只需序列化实体本身一次,然后再次反序列化该实体。除非您的逻辑中缺少某些内容。由于所讨论的值是从您的
序列化程序
方法返回的,该方法的详细信息非常重要。发布\u实体的定义
也发布反序列化程序
方法。我对我的答案进行了一些编辑,有一些事情你可能会改变。