views:

471

answers:

2

Are there any closed or open source projects for a XML serializer for C# that can serialize for the most part any object without the need to pollute my domain objects with tons of attributes? That will also handle serialization of collections built with the internal generics classes? A bonus would be that it can handle serializing an interface type property. Another bonus would be that it can serialize objects that have read-only properties (or atleast with the get accessor marked internal)

+5  A: 

Well, first define "advanced", i.e. what specifically do you need that XmlSerializer doesn't have. In terms of POCO, XmlSerializer has an overloaded ctor that accepts all the attributes you could ever want to add, to avoid having to add them to your object model - but it does still require a public parameterless constructor, and only works on public read/write fields/properties. And you should cache/re-use the serializer if you use this approach.

I'm not aware of any like alternatives, simply because in most cases this is "good enough" - and it is often a mistake to try to brute-force your existing domain object into a DTO. It may be simpler and more maintainable to simply map your domain entities onto a new DTO(s) that are attributed (and have appropriate ctor/properties/etc).

Note that for the ctor/properties issue DataContractSerializer has some answers, but this doesn't have as much fine-grained control over what the xml looks like.

Marc Gravell
I think the polluted objects route might be the best answer since I've learned of AutoMapper that should be able to do most of the translation with zero code.
Chris Marisic
A: 
  • You can allow System.Xml.dll to access your internals by using the InternalsVisibleToAttribute. Thus serializing internal types and/or internal members. Including internal .ctors.
  • You can also implement IXmlSerializable on classes to customize their serialization (like the container containing interface references).
  • You do not have to provide the XML serialization attributes on your classes, but provide them as XmlAttributeOverrides instead.

XmlSerializer is almost always exactly what people want, they just don't know that it is as flexible as it really is.

Robert Giesecke