public CExceptionDeserializer(Type type) : base(type)
        {
            List <MemberInfo> fieldList = CExceptionSerializer.GetSerializableFields();

            foreach (MemberInfo fieldInfo in fieldList)
            {
                if (m_deserFields.ContainsKey(fieldInfo.Name))
                {
                    m_deserFields[fieldInfo.Name] = fieldInfo;
                }
                else
                {
                    m_deserFields.Add(fieldInfo.Name, fieldInfo);
                }
            }
            m_type = type;
        }
Example #2
0
        /// <summary>
        /// Gets the serializer-Instance according to given type
        /// </summary>
        /// <param name="type">Type of the objects, that have to be serialized</param>
        /// <returns>Serializer - Instance</returns>
        public AbstractSerializer GetSerializer(Type type)
        {
            AbstractSerializer abstractSerializer = (AbstractSerializer)m_htSerializerMap[type];

            if (abstractSerializer == null)
            {
                // TODO: Serialisieren von Nullbaren Typen und generischen
                // Listen
                if (typeof(IDictionary).IsAssignableFrom(type))
                {
                    abstractSerializer = new CMapSerializer();
                }
                else if (typeof(IEnumerable).IsAssignableFrom(type))
                {
                    abstractSerializer = new CEnumerableSerializer();
                }
                else if (typeof(Stream).IsAssignableFrom(type))
                {
                    abstractSerializer = new CInputStreamSerializer();
                }
                else if (typeof(Exception).IsAssignableFrom(type))
                {
                    abstractSerializer = new CExceptionSerializer();
                }
                else if (type.IsArray)
                {
                    abstractSerializer = new CArraySerializer();
                }
                else if (type.IsEnum)
                {
                    abstractSerializer = new CEnumSerializer();
                }
                else if (typeof(ISerializable).IsAssignableFrom(type))
                {
                    abstractSerializer = new CISerializableSerializer();
                }
                else
                {
                    if (m_htCachedSerializerMap.ContainsKey(type.FullName))
                    {
                        abstractSerializer = (AbstractSerializer)m_htCachedSerializerMap[type.FullName];
                    }
                    else
                    {
                        //加锁防止多线程同时添加同一类型
                        lock (serializerLock)
                        {
                            //可能有一个线程已经添加,这里再判断一次
                            abstractSerializer = (AbstractSerializer)m_htCachedSerializerMap[type.FullName];
                            if (abstractSerializer != null)
                            {
                                return(abstractSerializer);
                            }
                            else
                            {
                                abstractSerializer = new CObjectSerializer(type);
                                m_htCachedSerializerMap.Add(type.FullName, abstractSerializer);
                                //abstractSerializer = new CJsonSerializer();
                                //m_htCachedSerializerMap.Add(type.FullName, abstractSerializer);
                            }
                        }
                    }
                }
            }
            return(abstractSerializer);
        }