最近写 socket程序遇到几个问题一直没有解决 记下 日后继续解决
问题背景:两个程序socket通讯 序列化

1 /// <summary> 2 /// 从对象转化为xml字符串 3 /// </summary> 4 /// <param name="obj"></param> 5 /// <returns></returns> 6 public static byte[] SerializeXml(object obj) 7 { 8 string xml = string.Empty; 9 XmlSerializer xs = new XmlSerializer(obj.GetType()); 10 XmlWriterSettings settings = new XmlWriterSettings() 11 { 12 Encoding = Encoding.UTF8 13 }; 14 MemoryStream stream = new MemoryStream();//如果用StringBuilder,转化出来的xml 编码是UTF16,XmlWriterSettings不起作用,. 只能对Stream进行编码更改。 15 using (XmlWriter writer = XmlWriter.Create(stream, settings)) 16 { 17 xs.Serialize(writer, obj); 18 } 19 return Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(stream.ToArray(), 0,stream.ToArray().Length).Trim());//此处转化为xml字符串后,会有一个编码是65279的小空格,大约只占1个像素. 20 } 21 22 23 public static byte[] Serialize(object obj) 24 { 25 DataContractSerializer serializer = new DataContractSerializer(obj.GetType()); 26 27 MemoryStream ms = new MemoryStream(); 28 29 serializer.WriteObject(ms, obj); 30 31 ms.Seek(0, 0); 32 return ms.ToArray(); 33 } 34 35 public static T Deserialize<T>(byte[] data) 36 { 37 string _serializeString = Encoding.UTF8.GetString(data, 0, data.Length); 38 DataContractSerializer serializer = new DataContractSerializer(typeof(T)); 39 40 MemoryStream ms = new MemoryStream(data); 41 ms.Seek(0, 0); 42 return (T)(serializer.ReadObject(ms)); 43 } 44 45 public static string SerializeToString(object obj) 46 { 47 DataContractSerializer serializer = new DataContractSerializer(obj.GetType()); 48 49 MemoryStream ms = new MemoryStream(); 50 51 serializer.WriteObject(ms, obj); 52 53 return Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length); 54 } 55 56 public static T DeserializeFromString<T>(string data) 57 { 58 byte[] buffer = Encoding.UTF8.GetBytes(data); 59 60 DataContractSerializer serializer = new DataContractSerializer(typeof(T)); 61 62 MemoryStream ms = new MemoryStream(buffer); 63 ms.Seek(0, 0); 64 return (T)(serializer.ReadObject(ms)); 65 }
的obejet to byte的时候和byte to obeject的时候再一个程序里面不报错
可是移至两个工程的时候 调试截取的数据都一样一到最后一步转换的时候就报 ” 根节点错误在第一行第一列“网上搜了很多办法都没解决
换了很多方法也没完成
最后没办法无奈了
只能先转换成json string 然后再在socket中传送 string 类型
最后在把jsonstring转换成对象
也算是不完美的完美
代码:

1 //序列化 注意此方法 需要引入第三方类库 newtonsoft 2 JsonConvert.SerializeObject( new Class1() { t = "1" }) 3 //反序列化 引入命名空间 如果是net3.5以下 需要下载web扩展dll 4 //否则直接引入这个空间就ok using System.Web.Script.Serialization; 5 JavaScriptSerializer jss = new JavaScriptSerializer(); 6 Class1 t = jss.Deserialize<Class1>(receivedContent); 7 receivedContent = t.t;