这个对象是不是很好的练习?还有,有更好的方法吗?

Gas*_*a79 0 c# casting

我目前正通过套接字连接接收序列化对象,这完美无瑕.我也很好地反序列化它.现在,我希望客户端通过网络发送多个对象类型(或类).

这就是我如何将我的对象反序列化为它的类型'MyClass':

var m = new MemoryStream(Convert.FromBase64String(dataReceived));
var b = new BinaryFormatter();
var o = (MyClass)b.Deserialize(m);
Run Code Online (Sandbox Code Playgroud)

现在,如果我想要接收多于一个对象类型,我可以创建一个方法,可以将其转换为任何支持的类型,或者发送一个标题,告诉我对象的类型,然后转换它.我更喜欢第一方式.

问题是,当然,我无法使用GetType()进行转换,并且使用name属性会导致出现一些我不喜欢的字符串切换.所以我决定我可以这样做:

object objectReceived = b.Deserialize(m);

if(o is MyClass){

    MyClass myClass = (MyClass) objectReceived;

}
else if (o is AnotherClass){

    AnotherClass myOtherClass = (AnotherClass) objectReceived;

}
Run Code Online (Sandbox Code Playgroud)

(我也可以使用as运算符执行某些操作,但这会让我在之后检查空值.例如)

var MyClass = objectReceived as MyClass; 
var AnotherClass = objectReceived as AnotherClass
Run Code Online (Sandbox Code Playgroud)

或者我可以实现一个接口,通过网络发送的每个对象都将实现,将对象转换为该接口,这将返回它的类型,然后相应地转换它!

问题是,我已经有了这个工作代码,但我无法找到一种简洁的方法来编写该接口.接口的方法应该返回什么?一种?一串?我真的不知道.这就是为什么我告诉自己:好吧,因为我有工作代码,如果这是一个好的做法并且易于维护,我不会因为时间限制而陷入制作我现在不知道如何的界面的麻烦.

所以这就是我的问题:我的方法是正确/良好的做法吗?或者界面方法更好?

非常感谢你的帮助!

Dav*_*haw 6

为什么不使用泛型?

您可以创建一个通用的反序列化方法,如下所示:

private T MyDeserialize<T>(String dataReceived)
{
    var m = new MemoryStream(Convert.FromBase64String(dataReceived)); 
    var b = new BinaryFormatter(); 
    return (T)b.Deserialize(m); 
}
Run Code Online (Sandbox Code Playgroud)

然后任何称之为:

MyClass myClassInstance = MyDeserialize<MyClass>(dataReceived);
Run Code Online (Sandbox Code Playgroud)

泛型

当你打电话给MyDeserialize<MyClass>(dataReceived);你时,通过泛型 让方法认为TMyClass.

想象一下这样做:

private MyClass MyDeserialize(String dataReceived)
{
    var m = new MemoryStream(Convert.FromBase64String(dataReceived)); 
    var b = new BinaryFormatter(); 
    return (MyClass)b.Deserialize(m); 
}
Run Code Online (Sandbox Code Playgroud)

显然你可以传递你喜欢的任何Type(类,如果你愿意)<>,它会使用那种类型.