/// <summary> /// Writes any object to the output stream. /// </summary> /// <param name="obj">object to write</param> public override void WriteObject(object obj) { if (obj == null) { WriteNull(); return; } AbstractSerializer abstractSerializer = m_serializerFactory.GetSerializer(obj.GetType()); abstractSerializer.WriteObject(obj, this); }
/// <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); }