=============================================
Serialization with POCOs and XmlWriter
=============================================
With the ``FhirXmlPocoDeserializer`` have added a serializer that serializes POCO's directly to ``XmlWriter`` objects, achieving higher throughput than the existing serializers with a much smaller memory footprint.
To use it, we first create an ``Xmlwriter`` and a ``FhirXmlPocoSerializer``, and then use the ``Serialize`` function to serialize a POCO to the XmlWriter. Which you can later use to get you the actual xml string.
.. code-block:: csharp
Patient p = new() { };
var sb = new StringBuilder();
using (var w = XmlWriter.Create(sb))
{
var serializer = new FhirXmlPocoSerializer(Specification.FhirRelease.STU3);
serializer.Serialize(p, w);
}
var xmlString = sb.ToString();
When initializing the ``FhirXmlPocoSerializer`` you have to specify which FHIR version you are using for serialization.
Note that the serializer will *not* validate the data passed to it, so it can easily be driven to produce XML that is incorrect, e.g.
this code:
.. code-block:: csharp
FhirBoolean b = new() { ObjectValue = "treu" };
Patient p = new() { Contact = new() [ new Patient.ContactComponent() ], ActiveElement = b };
will produce the following invalid FHIR Xml:
.. code-block:: xml
This is by design, as this is useful for round-tripping incorrect stored historical data. It avoids duplicate validation work and increases performance as well.
To ensure correct xml output, you should :ref:`validate` the instances first.
Generating a summary
--------------------
The serializer can be told to serialize only parts of an object's tree, thus generating a `summary view `_ of the FHIR data`.
To enable summary generation, create a concrete subclass of the ``SerializationFilter`` class, there are several pre-defined factory methods that you can use:
* SerializationFilter.ForSummary() - returns a new serialization filter to support ``_summary=true``
* SerializationFilter.ForText() - returns a new serialization filter for ``_summary=text``
* SerializationFilter.ForData() - returns a new serialization filter for ``_summary=data``
* SerializationFilter.ForElements() - returns a new serialization filter for ``_elements=``
The other summary forms mentioned in the FHIR specification do not need specific support from the serializer and can be constructed by hand.
Once created, such a filter must then be passed to the serialize method, like so:
.. code-block:: csharp
var summaryFilter = SerializationFilter.ForSummary();
Patient p = new() { };
var sb = new StringBuilder();
using (var w = XmlWriter.Create(sb))
{
var serializer = new FhirXmlPocoSerializer(Specification.FhirRelease.STU3);
serializer.Serialize(p, w, summaryFilter);
}
The filters are highly configurable and it is possible to write your own by subclassing ``SerializationFilter``. Please refer to the (pretty trivial)
implementation of the current summary filters (e.g. ``ElementMetadataFilter.cs`` and ``BundleFilter.cs``) in the source code for more information.