zoukankan      html  css  js  c++  java
  • 继承自DynamicObject的对象的Xml序列化

    默认情况下,对继承自DynamicObject的对象进行序列化操作是不会报错的,但是并没有实际序列化出任何东西来

    为了让它进行序列化,我们改造一下实现类,实现IXmlSerializable接口

    代码
      /// <summary>
        
    /// 动态对象
        
    /// </summary>
        [Serializable]
        
    public class SkelectoneDynamicObject : DynamicObject, IXmlSerializable
        {

            
    #region 字段

            
    /// <summary>
            
    /// 集合字典,存放实际的对象
            
    /// </summary>
            private Dictionary<stringobject> dictionary = new Dictionary<stringobject>();

            
    #endregion

            
    #region 公有方法

            
    public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                
    string name = binder.Name.ToLower();
                
    bool exist = dictionary.TryGetValue(name, out result);
                
    if (!exist)
                {
                    
    // 不存在,默认空
                    result = null;
                }
                
    return true;
            }

            
    public override bool TrySetMember(SetMemberBinder binder, object value)
            {
                
    if (value == null)
                {
                    
    // 删除这个属性
                    Remove(binder.Name.ToLower());
                }
                
    else
                {
                    dictionary[binder.Name.ToLower()] 
    = value;
                }
                
    return true;
            }

            
    #endregion       
          
            
    #region IXmlSerializable 通过实现该接口,对DynamicObject进行XML序列化

            
    public System.Xml.Schema.XmlSchema GetSchema()
            {
                
    return null;
            }

            
    public void ReadXml(System.Xml.XmlReader reader)
            {
                XmlSerializer keySerializer 
    = new XmlSerializer(typeof(string));
                XmlSerializer typeSerializer 
    = new XmlSerializer(typeof(string));            
                
    if (reader.IsEmptyElement || !reader.Read())
                {
                    
    return;
                }

                
    while (reader.NodeType != XmlNodeType.EndElement)
                {
                    reader.ReadStartElement(
    "item"); 

                    reader.ReadStartElement(
    "key");
                    
    string key = (string)keySerializer.Deserialize(reader);
                    reader.ReadEndElement();

                    reader.ReadStartElement(
    "type");
                    
    string type = (string)typeSerializer.Deserialize(reader);
                    reader.ReadEndElement();

                    Type realType 
    = Type.GetType(type);

                    reader.ReadStartElement(
    "value");
                    XmlSerializer valueSerializer 
    = new XmlSerializer(realType);
                    
    object value = valueSerializer.Deserialize(reader);
                    reader.ReadEndElement();

                    reader.ReadEndElement();

                    dictionary.Add(key, value);
                    reader.MoveToContent();
                }
                reader.ReadEndElement();

            }

            
    public void WriteXml(System.Xml.XmlWriter writer)
            {
                XmlSerializer keySerializer 
    = new XmlSerializer(typeof(string));
                XmlSerializer typeSerializer 
    = new XmlSerializer(typeof(string));
                
    foreach (string key in dictionary.Keys)
                {
                    writer.WriteStartElement(
    "item");

                    writer.WriteStartElement(
    "key");
                    keySerializer.Serialize(writer, key);
                    writer.WriteEndElement();

                    writer.WriteStartElement(
    "type");
                    typeSerializer.Serialize(writer, dictionary[key].GetType().FullName);
                    writer.WriteEndElement();

                    writer.WriteStartElement(
    "value");
                    XmlSerializer valueSerializer 
    = new XmlSerializer(dictionary[key].GetType());
                    valueSerializer.Serialize(writer, dictionary[key]);
                    writer.WriteEndElement();

                    writer.WriteEndElement();
                }
            }

            
    #endregion
        }

    这样这个对象就可以xml序列化了,但是当它作为一个属性创建时,申明是dynamic的

    public dynamic ExtendedProperties = new SkelectoneDynamicObject();

    Xml序列化需要的是确定的类型,会报错

    Test method Goline.Test.GoblineCreatureTest.TestSave threw exception:
    System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Skelectone.SkelectoneDynamicObject may not be used in this context. To use Skelectone.SkelectoneDynamicObject as a parameter, return type, or member of a class or struct, the parameter, return type, or member must be declared as type Skelectone.SkelectoneDynamicObject (it cannot be object). Objects of type Skelectone.SkelectoneDynamicObject may not be used in un-typed collections, such as ArrayLists.

    为此,我们构造一个用来序列化的对象

    代码
            /// <summary>
            
    /// 动态属性
            
    /// </summary>
            [XmlIgnore]
            
    public dynamic ExtendedProperties = new SkelectoneDynamicObject();

            
    /// <summary>
            
    /// 可序列化的动态属性
            
    /// 仅供系统内部使用,请不要使用该属性
            
    /// </summary>
            public SkelectoneDynamicObject SerializableExtendedProperties
            {
                
    get
                {
                    
    return ExtendedProperties;
                }
                
    set
                {
                    ExtendedProperties 
    = value;
                }
            }

    这样就实现了DynamicObject的Xml序列化,Binary序列化也可以类似实现ISerializable接口,这里就不给出实现了

  • 相关阅读:
    焦虑:都说程序员是青春饭,那么程序员老了何去何从呢?
    数据库查询语句优化,mysql优化,join语句优化附带YYC松鼠短视频系统详细demo效果
    IT行业:为什么大部分人都不认可php语言呢?
    拇指赚点赞无加密源码发布分享仅供学习
    区块鼠区块养殖系统源码无加密源码发布分享仅供学习
    3月1日晚突遭大量攻击,网站/APP突然遭遇黑客攻击时该如何应对?
    ThinkPHP内核全行业小程序运营管理系统源码免费分享下载
    2020年不管打工还是创业,居然还有人相信读书无用论?
    在IT界,应聘企业去上班如果老板一点不懂技术那绝对是作茧自缚
    看了这篇文章你还不懂傅里叶变换,那我就真没办法呢!
  • 原文地址:https://www.cnblogs.com/ueqtxu/p/1781559.html
Copyright © 2011-2022 走看看