首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Socket 開發實戰:基於 JSON 協議的資料收發與反射序列化

     編輯:關於.NET

背景

前文介紹 Socket 基類、封包拆包。本文優化協議內容採用 JSON 格式,優勢:

  • 可讀性強,便於除錯分析封包。
  • 脫離欄位順序依賴,支援向後相容(舊客戶端僅有 A、B 欄位,新增 C、D 仍可共存)。

核心改造:BaseEntity 反射序列化

原版按順序用 | 分隔,現改用 Newtonsoft.Json (C# 2.0) 或內建 JavaScriptSerializer (3.5+)。

修改前後對比

public class BaseEntity {
  protected string HeaderKey;
  public BaseEntity() {}
  // 解構:Socket 收到字串 → 物件
  public BaseEntity(string data) {
    #region 舊版按順序解析 (註解)
    // string[] arr = NetStringUtil.UnPack(data);
    // if (arr != null && arr.Length > 0) {
    //   int i=0; var fields = ReflectionUtil.GetFields(this);
    //   if (fields==null || arr.Length!=fields.Length) throw new ArgumentException("欄位不符");
    //   foreach (var f in fields) ReflectionUtil.SetField(this, f.Name, arr[i++]);
    // }
    #endregion

    // JSON 反序列化,相容歷史欄位 (以最小成員賦值)
    var obj = JsonTools.JsonToObject(data, this.GetType()) as BaseEntity;
    if (obj != null) {
      foreach (var f in ReflectionUtil.GetFields(obj)) {
        var val = ReflectionUtil.GetField(obj, f.Name);
        ReflectionUtil.SetField(this, f.Name, val);
      }
    }
  }

  // 序列化:物件 → Socket 發送字串
  public override string ToString() {
    string data;
    #region 舊版按順序組裝 (註解)
    // var sb = new StringBuilder();
    // foreach (var f in ReflectionUtil.GetFields(this)) { sb.Append(ReflectionUtil.GetField(this,f.Name)); sb.Append("|"); }
    // data = sb.ToString().Trim('|');
    #endregion
    data = JsonTools.ObjectToJson(this); // JSON 序列化

    if (string.IsNullOrEmpty(HeaderKey)) throw new ArgumentNullException("DataTypeKey", "未指定協議類型");
    return NetStringUtil.PackSend(HeaderKey, data);
  }
}

JsonTools 輔助類

public class JsonTools {
  public static string ObjectToJson(object obj) => JavaScriptConvert.SerializeObject(obj);
  public static object JsonToObject(string json, Type t) => JavaScriptConvert.DeserializeObject(json, t);
}

測試驗證

客戶端測試生成封包內容:

測試客戶端介面

JSON 封包內容範例

僅修改 BaseEntity 核心幾行即可無縫切換至 JSON 協議,展現良好封裝彈性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved