我目前正通过套接字连接接收序列化对象,这完美无瑕.我也很好地反序列化它.现在,我希望客户端通过网络发送多个对象类型(或类).
这就是我如何将我的对象反序列化为它的类型'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)
或者我可以实现一个接口,通过网络发送的每个对象都将实现,将对象转换为该接口,这将返回它的类型,然后相应地转换它!
问题是,我已经有了这个工作代码,但我无法找到一种简洁的方法来编写该接口.接口的方法应该返回什么?一种?一串?我真的不知道.这就是为什么我告诉自己:好吧,因为我有工作代码,如果这是一个好的做法并且易于维护,我不会因为时间限制而陷入制作我现在不知道如何的界面的麻烦.
所以这就是我的问题:我的方法是正确/良好的做法吗?或者界面方法更好?
非常感谢你的帮助!
为什么不使用泛型?
您可以创建一个通用的反序列化方法,如下所示:
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);你时,通过泛型 让方法认为T是MyClass.
想象一下这样做:
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(类,如果你愿意)<>,它会使用那种类型.
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |