예제 #1
0
        public override void Serialize(XmlWriter writer, T obj, XmlSerializableSettings settings)
        {
            if (obj != null)
            {
                var actualType = obj.GetType();
                Tuple <String, IXmlSerializer> subTypeSerializer = null;
                if (actualType == typeof(T) ||
                    KnownTypeSerializers == null ||
                    !TryGetKnownTypeSerializer(actualType, out subTypeSerializer))
                {
                    // We're the actual serializer that should be used for this type.
                    // Here comes the heavy lifting.
                    foreach (var attributeMember in AttributeMembers.Values)
                    {
                        attributeMember.SerializeMember(writer, obj, settings);
                    }

                    foreach (var elementMemberGroup in ElementMembers)
                    {
                        foreach (var elementMember in elementMemberGroup)
                        {
                            elementMember.SerializeMember(writer, obj, settings);
                        }
                    }

                    if (TextMember != null)
                    {
                        TextMember.SerializeMember(writer, obj, settings);
                    }
                }
                else
                {
                    writer.WriteAttributeString("xsi", "type", "http://www.w3.org/2001/XMLSchema-instance", subTypeSerializer.Item1);
                    subTypeSerializer.Item2.Serialize(writer, obj, settings);
                }
            }
        }
예제 #2
0
 public abstract void Serialize(XmlWriter writer, Object obj, XmlSerializableSettings settings);
예제 #3
0
            public void SerializeMember(XmlWriter writer, T instance, XmlSerializableSettings settings)
            {
                var val = this.Getter(instance);

                if (val != null)
                {
                    switch (this.NodeType)
                    {
                    case XmlNodeType.Attribute:
                        if (val != null)
                        {
                            writer.WriteStartAttribute(this.MemberName.Name, this.MemberName.Namespace);
                            this.serializer.Serialize(writer, val, settings);
                            writer.WriteEndAttribute();
                        }
                        break;

                    case XmlNodeType.Element:
                        if (this.isCollection)
                        {
                            if (val != null || !settings.OmitNulls)
                            {
                                if (this.wrapCollection)
                                {
                                    writer.WriteStartElement(this.MemberName.Name, this.MemberName.Namespace);
                                }

                                if (val != null)
                                {
                                    this.serializer.Serialize(writer, val, settings);
                                }
                                else if (this.wrapCollection)
                                {
                                    writer.WriteAttributeString("xsi", "nil", XsiNamespace, "true");
                                }

                                if (this.wrapCollection)
                                {
                                    writer.WriteEndElement();
                                }
                            }
                        }
                        else
                        {
                            if (val != null || !settings.OmitNulls)
                            {
                                writer.WriteStartElement(this.MemberName.Name, this.MemberName.Namespace);
                                if (val != null)
                                {
                                    this.serializer.Serialize(writer, val, settings);
                                }
                                else
                                {
                                    writer.WriteAttributeString("xsi", "nil", XsiNamespace, "true");
                                }
                            }
                            writer.WriteEndElement();
                        }
                        break;

                    case XmlNodeType.Text:
                        if (val != null)
                        {
                            this.serializer.Serialize(writer, val, settings);
                        }
                        break;

                    default:
                        throw new NotSupportedException(
                                  String.Format("The node type {0} is not supported.", this.NodeType)
                                  );
                    }
                }
            }