让序列化与Socket合作愉快

本文探讨如何结合序列化和反序列化技术优化Socket通信,避免字符串分隔导致的问题。通过定义数据封装类,服务器端(WPF)和客户端(Windows Store App)发送和接收字节流进行数据交换,提高通信效率。文中使用JSON进行序列化和反序列化,并建议在实际应用中先发送数据长度再发送内容,确保数据完整读取。
摘要由CSDN通过智能技术生成

我们在编写与Socket有关的应用程序时,在发送软为复杂的数据时,可能我们最常做的是把各个部分的数据转换为字符串,然后将这些字符串用一个分隔符连接起来进行发送。不过,不知道你有没有想过这样做还是有问题的。

比如,我用#来分隔各个字符串,在根据客户端输入的内容到服务器端进行查找,然后返回结果,万一用户输入的查找关键字中就包含#,那么就会影响我们对字符串进行分割了。

不知道各位有没有想过,把序列化和反序列化的技术也用到socket上?先定义一个封装数据的类,发送前将该类的对象序列化,然后发送;接收时,先接收字节流,然后再反序列化,得到某个对象。

这样一来是不是比单单发送字符串好多了。

下面我举的这个例子,服务器端用WPF开发,客户端是Windows Store App,当然我这里只是举例,其实这可以用于所有类型的应用程序,包括Windows Phone应用,原理是不变的。

 

一、服务器端

首先我们定义一个用于封装数据的类,这里就以一个产品信息类做演示,这个类在服务器端和客户端都要定义一遍,这样才方便序列化和反序列化,你也可以特立写到一个类库中,然后服务器端和客户端都引用该类库。

    [DataContract(Name = "product")]
    public class Product
    {
        /// <summary>
        /// 产品编号
        /// </summary>
        [DataMember(Name = "product_no")]
        public string ProductNo { get; set; }
        /// <summary>
        /// 产品名称
        /// </summary>
        [DataMember(Name = "product_name")]
        public string ProductName { get; set; }
        /// <summary>
        /// 产品单价
        /// </summary>
        [DataMember(Name = "product_price")]
        public decimal ProductPrice { get; set; }
    }


WPF窗口的XAML

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid Grid.Row="0" Margin="11">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="auto"/>
            </Grid.RowDefinitions>
            <TextBlock Text="产品编号:" Grid.Column="0" Grid.Row="0" Style="{DynamicResource tbLabel}"/>
            <TextBlock Text="产品名称:" Grid.Column=
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值