我有一个包含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?
答案 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。”
但就像我说的那样,你似乎每次都在做两次。您只需要对实体本身进行一次序列化,然后再将该实体反序列化。除非你的逻辑中缺少某些东西。