C#中的二进制反序列化通用对象

时间:2013-02-27 17:08:00

标签: c#-4.0 generics casting deserialization binary-deserialization

我有一个可以序列化的泛型类:

MyOwnGenericClass<T>

所以我想反序列化它,如果TString实例处理它,在另一种情况下我想抛出异常。

如何在反序列化时知道MyOwnGenericClass<T>中包含泛型的类型? 我必须在下面的代码中编写什么类?

new BinaryFormatter().Deserialize(fileStrieam);

3 个答案:

答案 0 :(得分:4)

这真的很容易。只需使用object,就像这样:

object obj = new BinaryFormatter().Deserialize(fileStrieam);

然后做你说你会做的事情:

if (!(obj is MyOwnGenericClass<string>))
    throw new Exception("It was something other than MyOwnGenericClass<string>");
else {
    MyOwnGenericClass<string> asMyOwn_OfString = obj as MyOwnGenericClass<string>;

    // do specific stuff with it
    asMyOwn.SpecificStuff();
}

因此,您不会检查T是否为string。 您检查的不仅仅是:您正在检查obj是否为MyOwnGenericClass< string >。 没有人说它永远是MyOwnGenericClass< something >,我们唯一的头痛就是找到那些东西。

您可以发送bool,字符串,整数,int的原始数组,甚至是StringBuilder。 然后有你的随行人员:你可以发送MyOwnGenericClass< int >MyOwnGenericClass< string >(这是你唯一接受的)。

答案 1 :(得分:1)

var test = new MyGenericType<string>();

var genericTypes = test.GetType().GetGenericArguments();
if (genericTypes.Length == 1 && genericTypes[0] == typeof(string))
{
    // Do deserialization
}
else
{
    throw new Exception();
}

答案 2 :(得分:1)

您可以使用Type.GetGenericArguments()来获取在运行时创建类型的泛型参数的实际值:

class MyGeneric<TValue> {}

object stringValue = new MyGeneric<string>();
object intValue = new MyGeneric<int>();

// prints True
Console.WriteLine(stringValue.GetType().GetGenericArguments()[0] == typeof(string));
// prints False
Console.WriteLine(intValue.GetType().GetGenericArguments()[0] == typeof(string));