C#中的ObjectInputStream和ObjectOutputStream的等价物

时间:2016-01-06 19:25:26

标签: java c# sockets stream

CSharp中这些Java类的等价物是什么?

用于实现带套接字的接口。

由于

2 个答案:

答案 0 :(得分:2)

.NET上有许多序列化程序。

最简单的是二进制序列化。它是C#

中最相似的等价物

https://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.110).aspx

问题在于,如果您使用此功能,您的服务器和客户端将需要以锁定步骤升级(即,如果您升级服务器,则必须更新所有客户端,否则服务器将无法升级能够反序列化来自旧客户端的请求)

DataContractSerializer提供XML格式的消息,并提供专为Web服务设计的选项,以便它可以进行一些版本容错。

https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer(v=vs.110).aspx

特别是,它允许遗漏属性(例如,当服务器升级为允许更多旋钮,但旧客户端不发送它们时)。

换个问题。 要从Socket获取流,只需使用套接字作为参数创建一个System.Net.Socket.NetworkStream对象实例。

Stream s = new NetworkStream(socket);
Windows Communication Foundation(WCF)摘要了很多关于编程分布式系统的细节。使用WCF编写服务器客户端应用程序而不是弄乱原始套接字要容易得多。

答案 1 :(得分:2)

没有直接的等价物,但使用普通的Stream和XmlSerializer / BinaryFormatter很容易实现它的功能。

以下是使用XmlSerializer的示例:

public void StoreToFile<T>(T ObjectToStore, string FileName)
{
    XmlSerializer ser = new XmlSerializer(typeof(T));
    using(Stream str = File.Create(FileName))
        ser.Serialize(str, ObjectToStore);
}

public T RetrieveFromFile(string FileName)
{
    XmlSerializer ser = new XmlSerializer(typeof(T));
    using(Stream str = File.Open(FileName))
        return (T)ser.Deserialize(str);
}

然后,当您想要将一个类存储在文件中时使用:

MyClass instance = new MyClass(); //The class we want to store.
StoreToFile(instance, "instance.dat");

并检索它:

MyClass instance = RetrieveFromFile<MyClass>("instance.dat");

这是在文件中只存储一个类的基本示例,但您可以扩展它以存储在这些流上连接的更多项目。

此外,getOutputStream和getInputStream没有直接对应物,您可以随时使用NetworkStream:

NetworkStream myStream = new NetworkStream(theSocket);

它将表现为输入和输出流,在.net流中通常是读/写,因此不需要有两个sepparated流。