等价于C#中的ObjectInputStream和ObjectOutputStream

本文关键字:ObjectOutputStream ObjectInputStream 中的 等价于 | 更新日期: 2023-09-27 18:29:18

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

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

感谢

等价于C#中的ObjectInputStream和ObjectOutputStream

.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

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

对于您的另一个问题。要从套接字获取流,只需创建一个以套接字为参数的System.Net.Socket.NetworkStream对象实例。

Stream s = new NetworkStream(socket);

Windows Communication Foundation(WCF)抽象了许多关于分布式系统编程的细节。使用WCF对服务器-客户端应用程序进行编程要容易得多,而不是干扰原始套接字。

没有它的直接等价物,但使用纯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中,流通常是读/写的,因此不需要有两个分开的流。

同样可以使用JSON序列化来完成,例如:

    private StreamReader inputStream = ...;
    private StreamWriter outputStream = ...;
            
     public void writeObject<T>(T s)
     {
          if (outputStream != null)
          { string jsonString = JsonSerializer.Serialize<T>(s);
            outputStream.WriteLine(jsonString); 
          }
          else
          { Console.WriteLine("ERROR: null output stream!");  }
     }
        public T readObject<T>()
        { if (inputStream != null)
          {
            string jsonString = inputStream.ReadLine();
            T res =
              JsonSerializer.Deserialize<T>(jsonString);
            return res;
          }
          return default(T); 
        }

请注意,T必须是一个公共类,并且只有公共字段被序列化。

相关文章:
  • 没有找到相关文章