如何将byte []反序列化为要在方法调用时强制转换的通用对象 [英] How to deserialize byte[] into generic object to be cast at method call
问题描述
我正在研究对象加密类。我已经解决了所有问题,但是我希望能够使用一种反序列化方法来加密/解密任何对象类型。到目前为止,唯一阻止我的是反序列化方法。我有返回类型(对象)的函数,希望返回弱类型的对象。只要我在返回值赋值期间转换类型,它就可以工作,但是如果我反序列化为对象类型,则结果为byte []。
I am working on an object encryption class. I have everything worked out but I want to be able to encrypt/decrypt any object type with one deserialize method. As of now the only thing holding me up is the deserialize method. I have the function returning type(object) in the hopes of returning a weak typed object. It works as long as I cast the type during the return value assignment, but If I deserialize into type 'object' the result is byte[].
这意味着我必须为要操作的每个对象(T)编写反序列化方法。我想做的是将Type(T)作为参数传递给反序列化方法,这样我就可以反序列化为object(T),然后返回键入的对象。
This means that I have to write a deserialize method for every object(T) i want to operate on. What I want to do is pass Type(T) as a parameter to the deserialize method so I can deserialize into object(T), then return the typed object.
The问题在于,显然不允许使用类型化的参数。
如果我做 obj =(type.GetType())br.Deserialize(ms);
我得到;
The problem is that using a typed parameter is apparently not allowed.
If I do obj = (type.GetType())br.Deserialize(ms);
I get ; expected
between '(object(T)) and br.'.
如果我这样做 obj =(br。 Deserialize(ms)as type);
我得到找不到命名空间 type的类型。 (您是否缺少using指令或程序集引用?)
或我收到无法解析的符号错误。
任何帮助表示赞赏。完整代码如下。
or I get a symbol can not be resolved error. Any help is appreciated. Full code is below.
private byte[] serialize(object param)
{
byte[] encMsg = null;
using (MemoryStream ms = new MemoryStream())
{
IFormatter br = new BinaryFormatter();
br.Serialize(ms, param);
encMsg = ms.ToArray();
}
return encMsg;
}
private object deserialize(byte[] param)
{
object obj = null;
using (MemoryStream ms = new MemoryStream(param))
{
IFormatter br = new BinaryFormatter();
obj = (br.Deserialize(ms) as myObject);
}
return obj;
}
private byte[] encrypt(byte[] param)
{
byte[] encMsg = null;
using (Aes myAes = Aes.Create())
{
myAes.Padding = PaddingMode.ANSIX923;
ICryptoTransform autoBot = myAes.CreateEncryptor(myAes.Key, myAes.IV);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, autoBot, CryptoStreamMode.Write))
{
cs.Write(param, 0, (int)param.Length);
}
encMsg = ms.ToArray();
}
}
return encMsg;
}
private byte[] decrypt(byte[] key, byte[] iv, byte[] param)
{
byte[] dcparam = null;
using (Aes myAes = Aes.Create())
{
myAes.Padding = PaddingMode.ANSIX923;
ICryptoTransform autoBot = myAes.CreateDecryptor(key, iv);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, autoBot, CryptoStreamMode.Write))
{
cs.Write(param, 0, (int)param.Length);
}
dcparam = ms.ToArray();
}
}
return dcparam;
}
推荐答案
您要反序列化的类型必须在编译时就知道。。所以您的方法应类似于:
The type you want to deserialize must be known at compile time.. So your method can be like:
private T Deserialize<T>(byte[] param)
{
using (MemoryStream ms = new MemoryStream(param))
{
IFormatter br = new BinaryFormatter();
return (T)br.Deserialize(ms);
}
}
现在您可以像
var myclass = Deserialize<MyClass>(buf);
这篇关于如何将byte []反序列化为要在方法调用时强制转换的通用对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!