Beispiel #1
0
        private void write(ClassMapping mapping, object instance, bool summary, PropertyMapping prop, SerializationMode mode)
        {
            // Check whether we are asked to just serialize the value element (Value members of primitive Fhir datatypes)
            // or only the other members (Extension, Id etc in primitive Fhir datatypes)
            // Default is all
            if (mode == SerializationMode.ValueElement && !prop.RepresentsValueElement)
            {
                return;
            }
            if (mode == SerializationMode.NonValueElements && prop.RepresentsValueElement)
            {
                return;
            }

            var value        = prop.GetValue(instance);
            var isEmptyArray = (value as IList) != null && ((IList)value).Count == 0;

            //   Message.Info("Handling member {0}.{1}", mapping.Name, prop.Name);

            if (value != null && !isEmptyArray)
            {
                string memberName = prop.Name;

                // For Choice properties, determine the actual name of the element
                // by appending its type to the base property name (i.e. deceasedBoolean, deceasedDate)
                if (prop.Choice == ChoiceType.DatatypeChoice)
                {
                    memberName = determineElementMemberName(prop.Name, value.GetType());
                }

                _current.WriteStartProperty(memberName);

                var writer = new DispatchingWriter(_current);

                // Now, if our writer does not use dual properties for primitive values + rest (xml),
                // or this is a complex property without value element, serialize data normally
                if (!_current.HasValueElementSupport || !serializedIntoTwoProperties(prop, value))
                {
                    writer.Serialize(prop, value, summary, SerializationMode.AllMembers);
                }
                else
                {
                    // else split up between two properties, name and _name
                    writer.Serialize(prop, value, summary, SerializationMode.ValueElement);
                    _current.WriteEndProperty();
                    _current.WriteStartProperty("_" + memberName);
                    writer.Serialize(prop, value, summary, SerializationMode.NonValueElements);
                }

                _current.WriteEndProperty();
            }
        }
        public void Serialize(PropertyMapping prop, object instance, bool summary, ComplexTypeWriter.SerializationMode mode)
        {
            if (prop == null) throw Error.ArgumentNull("prop");

            var elements = instance as IList;                       
            if(elements == null) throw Error.Argument("existing", "Can only write repeating elements from a type implementing IList");

            _current.WriteStartArray();

            foreach(var element in elements)
            {
                var writer = new DispatchingWriter(_current);
                writer.Serialize(prop, element, summary, mode);
            }

            _current.WriteEndArray();
        }
        private void write(ClassMapping mapping, object instance, bool summary, PropertyMapping prop, SerializationMode mode)
        {
            // Check whether we are asked to just serialize the value element (Value members of primitive Fhir datatypes)
            // or only the other members (Extension, Id etc in primitive Fhir datatypes)
            // Default is all
            if (mode == SerializationMode.ValueElement && !prop.RepresentsValueElement) return;
            if (mode == SerializationMode.NonValueElements && prop.RepresentsValueElement) return;

            var value = prop.GetValue(instance);
            var isEmptyArray = (value as IList) != null && ((IList)value).Count == 0;

         //   Message.Info("Handling member {0}.{1}", mapping.Name, prop.Name);

            if (value != null && !isEmptyArray)
            {
                string memberName = prop.Name;

                // For Choice properties, determine the actual name of the element
                // by appending its type to the base property name (i.e. deceasedBoolean, deceasedDate)
                if (prop.Choice == ChoiceType.DatatypeChoice)
                {
                    memberName = determineElementMemberName(prop.Name, GetSerializationTypeForDataTypeChoiceElements(prop, value));
                }

                _writer.WriteStartProperty(memberName);
               
                var writer = new DispatchingWriter(_writer);

                // Now, if our writer does not use dual properties for primitive values + rest (xml),
                // or this is a complex property without value element, serialize data normally
                if(!_writer.HasValueElementSupport || !serializedIntoTwoProperties(prop,value))
                    writer.Serialize(prop, value, summary, SerializationMode.AllMembers);
                else
                {
                    // else split up between two properties, name and _name
                    writer.Serialize(prop,value, summary, SerializationMode.ValueElement);
                    _writer.WriteEndProperty();
                    _writer.WriteStartProperty("_" + memberName);
                    writer.Serialize(prop, value, summary, SerializationMode.NonValueElements);
                }

                _writer.WriteEndProperty();
            }
        }
        public void Serialize(PropertyMapping prop, object instance, ComplexTypeWriter.SerializationMode mode)
        {
            if (prop == null)
            {
                throw Error.ArgumentNull("prop");
            }

            var elements = instance as IList;

            if (elements == null)
            {
                throw Error.Argument("existing", "Can only write repeating elements from a type implementing IList");
            }

            _current.WriteStartArray();

            foreach (var element in elements)
            {
                var writer = new DispatchingWriter(_current);
                writer.Serialize(prop, element, mode);
            }

            _current.WriteEndArray();
        }
Beispiel #5
0
        public void Serialize(PropertyMapping prop, object instance, Rest.SummaryType summary, ComplexTypeWriter.SerializationMode mode)
        {
            if (prop == null)
            {
                throw Error.ArgumentNull(nameof(prop));
            }

            var elements = instance as IList;

            if (elements == null)
            {
                throw Error.Argument(nameof(elements), "Can only write repeating elements from a type implementing IList");
            }

            _writer.WriteStartArray();

            foreach (var element in elements)
            {
                var writer = new DispatchingWriter(_writer, Settings);
                writer.Serialize(prop, element, summary, mode);
            }

            _writer.WriteEndArray();
        }
        private void write(ClassMapping mapping, object instance, Rest.SummaryType summary, PropertyMapping prop, SerializationMode mode)
        {
            if (Settings.CustomSerializer != null)
            {
#pragma warning disable 618
                bool done = Settings.CustomSerializer.OnBeforeSerializeProperty(prop.Name, instance, _writer);
#pragma warning restore
                if (done)
                {
                    return;
                }
            }

            // Check whether we are asked to just serialize the value element (Value members of primitive Fhir datatypes)
            // or only the other members (Extension, Id etc in primitive Fhir datatypes)
            // Default is all
            if (mode == SerializationMode.ValueElement && !prop.RepresentsValueElement)
            {
                return;
            }
            if (mode == SerializationMode.NonValueElements && prop.RepresentsValueElement)
            {
                return;
            }

            object value        = prop.GetValue(instance);
            var    isEmptyArray = (value as IList) != null && ((IList)value).Count == 0;

            //   Message.Info("Handling member {0}.{1}", mapping.Name, prop.Name);

            if ((value != null || prop.RepresentsValueElement && prop.ElementType.IsEnum() && !string.IsNullOrEmpty(((Primitive)instance).ObjectValue as string)) && !isEmptyArray)
            {
                string memberName = prop.Name;

                // Enumerated Primitive.Value of Code<T> will always serialize the ObjectValue, not the derived enumeration
                if (prop.RepresentsValueElement && prop.ElementType.IsEnum())
                {
                    value = ((Primitive)instance).ObjectValue;
                    //var rawValueProp = ReflectionHelper.FindPublicProperty(mapping.NativeType, "RawValue");
                    //var rawValue = rawValueProp.GetValue(instance, null);
                    //if (rawValue != null)
                    //    value = rawValue;
                }

                // For Choice properties, determine the actual name of the element
                // by appending its type to the base property name (i.e. deceasedBoolean, deceasedDate)
                if (prop.Choice == ChoiceType.DatatypeChoice)
                {
                    memberName = determineElementMemberName(prop.Name, GetSerializationTypeForDataTypeChoiceElements(prop, value));
                }

                _writer.WriteStartProperty(memberName);

                var writer = new DispatchingWriter(_writer, Settings);

                // Now, if our writer does not use dual properties for primitive values + rest (xml),
                // or this is a complex property without value element, serialize data normally
                if (!_writer.HasValueElementSupport || !serializedIntoTwoProperties(prop, value))
                {
                    writer.Serialize(prop, value, summary, SerializationMode.AllMembers);
                }
                else
                {
                    // else split up between two properties, name and _name
                    writer.Serialize(prop, value, summary, SerializationMode.ValueElement);
                    _writer.WriteEndProperty();
                    _writer.WriteStartProperty("_" + memberName);
                    writer.Serialize(prop, value, summary, SerializationMode.NonValueElements);
                }

                _writer.WriteEndProperty();
            }
        }