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

Pav*_*vel 2 generics casting deserialization c#-4.0 binary-deserialization

我有一个可以序列化的通用类:

MyOwnGenericClass<T>
Run Code Online (Sandbox Code Playgroud)

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

反序列化时如何知道泛型包含的类型MyOwnGenericClass<T>?我必须将以下代码投射到哪个类?

new BinaryFormatter().Deserialize(fileStrieam);
Run Code Online (Sandbox Code Playgroud)

Edu*_*tru 5

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

object obj = new BinaryFormatter().Deserialize(fileStrieam);
Run Code Online (Sandbox Code Playgroud)

然后按照你说的去做:

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();
}
Run Code Online (Sandbox Code Playgroud)

所以你没有检查是否T是一个string. 您要检查的不仅仅是这些:您要检查 obj 是否是MyOwnGenericClass< string >. 没有人说它永远是一个MyOwnGenericClass< something >,而我们唯一头痛的是找到它是什么。

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