【C#网络编程】序列化和反序列化

https://www.cnblogs.com/amylis_chen/p/11578598.html
https://www.cnblogs.com/1549983239yifeng/p/14789106.html
https://www.cnblogs.com/xueyubao/p/11262320.html
https://blog.csdn.net/qq_37179591/article/details/105736690
https://www.cnblogs.com/guogangj/p/7489218.html

二进制序列化

无法找到程序集“Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”

image
类分处于服务器命名空间下和客户端命名空间下,命名空间的不一致也就是类的不一致导致了对象在反序列化时出现错误。

解决1——SerializationBinder

SerializationBinder类

public class UBinder : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            // 从E:\TibetGlobal.dll读取
            var path = Path.Combine("E:\\", "TibetGlobal.dll");
            var assembly = Assembly.LoadFrom(globalPath);
            return assembly.GetType(typeName);
            }
        }
    }

 public class UBinder : SerializationBinder
        {
                public override Type BindToType(string assemblyName, string typeName)
                {
                        Assembly ass = Assembly.GetExecutingAssembly();
                        return ass.GetType(typeName);
                }
       }
————————————————
版权声明:本文为CSDN博主「yunzhonghefei1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yunzhonghefei1/article/details/106528366


var formatter = new BinaryFormatter
{
    Binder = new UBinder()
};
var obj = formatter.Deserialize(pipeServer);

解决2——DLL

XML序列化

无法XML序列化的情况

常见的两种模式,Binary和XML序列化,Binary二进制序列化没有什么限制,但是XML序列化有限制:

(1)需序列化的字段必须是公共的(public)
(2)需要序列化的类都必须有一个无参的构造函数
(3)枚举变量可序列化为字符串,无需用[XmlInclude]
(4)**序列化非基本类型对象,必须在对象前用[XmlInclude]将可能需要序列化的自定义复杂类型进行事先声明。**该规则递归作用到子元素。
    如导出ArrayList对象,若其成员是自定义的,需预包含处理:
    ```c#
      using System.Xml.Serialization;
      [XmlInclude(typeof(自定义类))]
      [Serilizable]
    ```
(5)Attribute中的IsNullable参数若等于false,表示若元素为null则不显示该元素。
    也就是说:针对值类型(如结构体)该功能是实效的
    若数组包含了100个空间,填充了10个类对象,则序列化后只显示10个节点
    若数组包含了100个空间,填充了10个结构体对象,则序列化后会显示100个节点
(6)真正无法XML序列化的情况
    某些类就是无法XML序列化的(即使使用了[XmlInclude])
        IDictionary(如HashTable)
        System.Drawing.Color
        System.Drawing.Font
        SecurityAttribute声明
    父类对象赋予子类对象值的情况
    对象间循环引用
(7)对于无法XML序列化的对象,可考虑
    使用自定义xml序列化(实现IXmlSerializable接口)
    实现IDictionary的类,可考虑(1)用其它集合类替代;(2)用类封装之,并提供Add和this函数
    某些类型需要先经过转换,然后才能序列化为 XML。如XML序列化System.Drawing.Color,可先用ToArgb()将其转换为整数 
    过于复杂的对象用xml序列化不便的话,可考虑用二进制序列化

在很多情况下,二进制序列化对对象的序列化信息更加完整、准确。

xml设置某些字段、属性不序列化

[System.NonSerialized]——二进制序列化
[System.Xml.Serialization.XmlIgnore]——XML序列化

XML序列化常用注解Attribute

posted @ 2023-05-29 14:07  仰望星河Leon  阅读(56)  评论(0)    收藏  举报