コード例 #1
0
 public override void Serialize(Array item, XmlWriter writer)
 {
     writer.WriteStartElement("Array");
     try
     {
         writer.WriteAttributeString("Count", item.Length.ToString(CultureInfo.InvariantCulture));
         foreach (var element in item)
         {
             writer.WriteStartElement("Entry");
             try
             {
                 if (null == element)
                 {
                     writer.WriteAttributeString("IsNull", true.ToString());
                     continue;
                 }
                 writer.WriteAttributeString("IsNull", false.ToString());
                 var elementType = element.GetType();
                 writer.WriteAttributeString("Type", elementType.AssemblyQualifiedName ?? "???");
                 var serializer = XmlSerializerService.GetSerializer(elementType);
                 serializer.Serialize(element, writer);
             }
             finally
             {
                 writer.WriteEndElement();
             }
         }
     }
     finally { writer.WriteEndElement(); }
 }
コード例 #2
0
        public override T Deserialize(XmlReader reader)
        {
            var target = Activator.CreateInstance(typeof(T));

            reader.SkipToElement(xmlFriendlyName);
            if (reader.IsEmptyElement)
            {
                return((T)target);
            }
            reader.ReadStartElement(xmlFriendlyName);
            try
            {
                foreach (var member in Graph)
                {
                    reader.SkipToElement(member.Member.Name);
                    try
                    {
                        IXmlSerializer serializer;
                        var            typeName = reader.GetAttribute("Type");
                        if (null != typeName)
                        {
                            var memberType = Type.GetType(typeName);
                            if (null == memberType)
                            {
                                continue;
                            }
                            serializer = XmlSerializerService.GetSerializer(memberType);
                        }
                        else
                        {
                            serializer = member.TypeSerializer;
                        }
                        reader.ReadStartElement(member.Member.Name);
                        var value = serializer.Deserialize(reader);
                        try
                        {
                            if (value is NullType)
                            {
                                member.SetValue(ref target, null);
                            }
                            else
                            {
                                member.SetValue(ref target, value);
                            }
                        }
                        catch (Exception e)
                        {
                            PostQuit(e, MethodBase.GetCurrentMethod());
                            break;
                        }
                    }
                    finally
                    {
                        CompleteRead(reader);
                    }
                }
                return((T)target);
            }
            finally { CompleteRead(reader); }
        }
コード例 #3
0
 public override Array Deserialize(XmlReader reader)
 {
     reader.SkipToElement("Array");
     try
     {
         var countString = reader.GetAttribute("Count");
         int count;
         if (!int.TryParse(countString, out count))
         {
             return(null);
         }
         var target = Array.CreateInstance(arrayElementType, count);
         if (reader.IsEmptyElement)
         {
             return(target);
         }
         reader.ReadStartElement("Array");
         for (var i = 0; i < count; ++i)
         {
             try
             {
                 reader.SkipToElement("Entry");
                 var isNull = bool.Parse(reader.GetAttribute("IsNull") ?? "true");
                 if (isNull)
                 {
                     continue;
                 }
                 var elementTypeString = reader.GetAttribute("Type");
                 if (null == elementTypeString)
                 {
                     continue;
                 }
                 var elementType = Type.GetType(elementTypeString);
                 if (null == elementType)
                 {
                     continue;
                 }
                 reader.ReadStartElement("Entry");
                 var serializer = XmlSerializerService.GetSerializer(elementType);
                 var result     = serializer.Deserialize(reader);
                 target.SetValue(result, i);
             }
             finally { reader.ReadEndElement(); }
         }
         return(target);
     }
     finally
     {
         if (reader.IsEmptyElement)
         {
             reader.Skip();
         }
         else
         {
             reader.ReadEndElement();
         }
     }
 }
コード例 #4
0
        /// <summary>
        /// Serializes the specified item.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="target">The target.</param>
        public override void Serialize(T item, XmlWriter target)
        {
            target.WriteStartElement(xmlFriendlyName);
            try
            {
                foreach (var member in Graph)
                {
                    target.WriteStartElement(member.Member.Name);
                    try
                    {
                        IXmlSerializer serializer;
                        var            value = member.IsDelegate ? null : member.GetValue(item);
                        if (null == value || member.IsUntyped)
                        {
                            value = value ?? new NullType();
                            var type = value.GetType();
                            serializer = XmlSerializerService.GetSerializer(type);
                            WriteType(target, type);
                        }
                        else
                        {
                            serializer = member.TypeSerializer;
                        }

                        try
                        {
                            serializer.Serialize(value, target);
                        }
                        catch (Exception e)
                        {
                            PostQuit(e, MethodBase.GetCurrentMethod());
                            break;
                        }
                    }
                    finally { target.WriteEndElement(); }
                }
            }
            finally { target.WriteEndElement(); }
        }
コード例 #5
0
 public ArraySerializer(Type arrayType)
 {
     elementType       = arrayType.GetElementType();
     elementSerializer = XmlSerializerService.GetSerializer(elementType);
 }