Imports System.Xml.Serialization
Public Module XObjectExtensions
<System.Runtime.CompilerServices.Extension>
Public Function SerializeToXDocument(Of T)(obj As T, serializer As XmlSerializer, ns As XmlSerializerNamespaces) As XDocument
Dim doc = New XDocument()
Using writer = doc.CreateWriter()
serializer = If(serializer, New XmlSerializer(obj.GetType()))
serializer.Serialize(writer, obj, ns)
If doc.Root IsNot Nothing AndAlso ns IsNot Nothing Then
For Each name In ns.ToArray().Except(doc.Root.Attributes().Where(Function(a) a.IsNamespaceDeclaration).Select((Function(a) New XmlQualifiedName(a.Name.LocalName, a.Value))))
doc.Root.Add(New XAttribute("xmlns" + (If(String.IsNullOrEmpty(name.Name), String.Empty, ":" + name.Name)), name.Namespace))
Public Property Foo() As String
Dim oXML = New TestClass()
Dim x As New Xml.Serialization.XmlSerializer(oXML.GetType, "urn:oecd:blah:blah")
Dim xmlns = New XmlSerializerNamespaces()
xmlns.Add(String.Empty, "urn:oecd:blah:blah")
xmlns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance")
xmlns.Add("sfa", "urn:oecd:blah:blah1")
xmlns.Add("iso", "urn:oecd:blah:blah2")
xmlns.Add("ftc", "urn:oecd:blah:blah")
Using sw = New IO.StringWriter()
x.Serialize(sw, oXML, xmlns)
Console.WriteLine("Default Serialization: ")
Dim xDoc = oXML.SerializeToXDocument(x, xmlns)
Using sw = New IO.StringWriter()
Console.WriteLine("Fixed serialization: ")