【问题标题】:How to know the size of the information sent through a socket (serialized object)如何知道通过套接字发送的信息的大小(序列化对象)
【发布时间】:2017-03-01 05:12:10
【问题描述】:

我正在实现客户端-服务器通信。我需要向大小可能不同的客户端发送响应,因为它包含一个序列化数组:

[Serializable]
public struct ServerResponse
{
    public ApplicationAction ApplicationAction { get; set; }
    public Product[] AssociatedProducts { get; set; }
}

我目前正在做的是使用 XmlSerializer 将我的 ServerResponse 实例序列化为 XML(使用另一种方法完全不会打扰我,我的数据不需要是人类可读的)并将其写入套接字流像这样:

        XmlSerializer xmlSerializer = new XmlSerializer(typeof(ServerResponse));
        NetworkStream networkStream = client.GetStream();
        if (networkStream.CanWrite)
        {
            xmlSerializer.Serialize(networkStream, response);
        }

我的问题是客户端不知道它需要读取的数据的大小。 我的猜测是先发送数据的大小,然后发送所有数据,但要做到这一点我需要知道

如何获得序列化对象的实际大小?

谢谢

【问题讨论】:

  • 你使用什么序列化方法,请说明。你使用json格式吗?二进制? XML?或其他。提供用于序列化此类的代码。
  • 我编辑了这个问题。我正在使用 XML,但我不介意使用其他格式,因为我的数据不需要人类可读,也许二进制会更合适。
  • 我建议将ServerResponse 序列化为本地文件(例如临时文件),然后将该文件发送给客户端。由于它是本地文件,因此您知道它的大小。
  • @dcg 如果您以后不需要此数据,则使用驱动器存储临时数据是一种不好的做法。始终将内存用于临时数据。

标签: c# arrays serialization server


【解决方案1】:

在您发送任何数据之前,您应该使用MemoryStream 将您的 Stream 序列化到内存中。然后你可以把它的长度乘以sizeof(byte)

您的代码将如下所示:

        XmlSerializer xmlSerializer = new XmlSerializer(typeof(JsonQuestion));
        NetworkStream networkStream = client.GetStream();
        MemoryStream memoryStream = new MemoryStream();
        xmlSerializer.Serialize(memoryStream, response);
        var length = memoryStream.Length * sizeof(byte);
        //Send size
        ...
        //Send data
        if (networkStream.CanWrite)
        {
            memoryStream.CopyTo(networkStream);
        }

【讨论】:

  • 如果ServerResponse 很大会怎样?
  • 您将在发送数据之前将所有内容缓存到内存中。但是您仍在这样做,因为如果我没记错的话,所有默认序列化程序都会在发送之前将所有数据存储在流中。
  • 好吧,我错了。 MemoryStream 将对内存造成额外压力,因为您必须在发送之前以字节形式缓存所有数据。但是您没有其他(快速)选项可以知道您将发送的数据的确切长度。如果您不需要知道字节的数据量,您可以只使用某种近似值,关于 XmlTextWriter 将如何添加到最终字符串中的附加数据。
  • 我正在考虑的另一件事是更改客户端的逻辑并在数据到来时读取数据,即按块读取数据,然后您会忘记计算发送内容的大小服务器。
  • 你不必分块发送,看这里stackoverflow.com/questions/26058594/…
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 2011-05-14
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多