[Fork] https://stackoverflow.com/questions/53226893/vb-net-create-a-class-to-serialize

VbNet · Console

/Program.vb

Imports System
Imports System.Collections.Generic
Imports System.Collections
Imports System.IO
Imports System.Text
Imports System.Collections.ObjectModel
Imports System.Linq
Imports System.Reflection

Imports System.Xml.Serialization
Imports System.Xml
Imports System.Xml.Linq
Imports System.Xml.XPath
Imports System.Xml.Schema

 ' https://stackoverflow.com/questions/53226893/vb-net-create-a-class-to-serialize

	<XmlRoot([Namespace]:="FatturaElettronica")>
	<XmlType([Namespace]:="")> ' Fixed added empty namespace for all elements.
	Public Class FatturaElettronica
		Public quantity As Integer

		Sub New()
			FatturaElettronicaHeader = New FatturaElettronicaHeader
		End Sub

		Property FatturaElettronicaHeader As FatturaElettronicaHeader
	End Class

	Public Class FatturaElettronicaHeader
		Sub New()
			DatiTrasmissione = New DatiTrasmissione
		End Sub

		Property DatiTrasmissione As DatiTrasmissione
	End Class

	Public Class DatiTrasmissione
		Sub New()
			Idtrasmittente = New idTrasmittente
            ' By allocating ContattiTrasmittente you cause its value to be serialized by default
			ContattiTrasmittente = New ContattiTrasmittente
		End Sub

		Property Idtrasmittente As idTrasmittente
		Property ProgressivoInvio As String

		' Fixed added FormatoTrasmissioneSpecified and made FormatoTrasmissione an explicitly implemented property
        Private m_FormatoTrasmissione as FormatoTrasmissioneType

		<XmlIgnore>
		Public Property FormatoTrasmissioneSpecified as Boolean

		Property FormatoTrasmissione As FormatoTrasmissioneType
			Get
				Return m_FormatoTrasmissione
			End Get
			Set
				' For convenience set FormatoTrasmissioneSpecified automatically when the property is set publicly.
				FormatoTrasmissioneSpecified = true
				m_FormatoTrasmissione = value
			End Set
		End Property

		Property CodiceDestinatario As String

        ' Fixed added ShouldSerializeContattiTrasmittente()
        Property ContattiTrasmittente As ContattiTrasmittente
								
		Public Function ShouldSerializeContattiTrasmittente() as Boolean
			Return ContattiTrasmittente.ShouldSerialize()
		End Function
								
		Property PecDestinatario As String
	End Class

	Public Class idTrasmittente
		Property IdPaese As String
		Property IdCodice As String
	End Class

	Public Class ContattiTrasmittente
		Property Telefono As String
		Property Email As String
	End Class

	' Fixed added an extension method to test whether a ContattiTrasmittente should be serialized.
	Public Module ContattiTrasmittenteExtensions  
		<System.Runtime.CompilerServices.Extension()> _
		Public Function ShouldSerialize(ByVal ContattiTrasmittente as ContattiTrasmittente) as Boolean
			Return ContattiTrasmittente IsNot Nothing And (ContattiTrasmittente.Telefono IsNot Nothing Or ContattiTrasmittente.Email IsNot Nothing)
		End Function
	End Module
												
	Public Enum FormatoTrasmissioneType
		FPA12
		FPR12
	End Enum

	Public Module Module1
		Public Sub Main()
			Dim fattEle As New FatturaElettronica
			Dim ns2 As New Xml.Serialization.XmlSerializerNamespaces()

			ns2.Add("p", "FatturaElettronica")														

			Dim xml as String = fattEle.GetXml(ns2)

			Console.WriteLine("")
			Console.WriteLine("{0} with FormatoTrasmissione unspecified:", fattEle)
			Console.WriteLine(xml)

			fattEle.FatturaElettronicaHeader.DatiTrasmissione.FormatoTrasmissione = Nothing

			Dim xml2 as String = fattEle.GetXml(ns2)
			Console.WriteLine("")
			Console.WriteLine("{0} with FormatoTrasmissione specified:", fattEle)
			Console.WriteLine(xml2)

		End Sub

		Function GetXml() As String
			Dim xml as String = <myvar>
		<var>...</var>

	</myvar>.ToString()
			Return xml
		End Function

	End Module

	Public Module XmlSerializationHelper
		<System.Runtime.CompilerServices.Extension> _
		Public Function LoadFromXML(Of T)(xmlString As String) As T
			Using reader As New StringReader(xmlString)
				Return DirectCast(New XmlSerializer(GetType(T)).Deserialize(reader), T)
			End Using
		End Function

		<System.Runtime.CompilerServices.Extension> _
		Public Function GetXml(Of T)(obj As T, Optional omitStandardNamespaces As Boolean = False) As String
			Dim ns As XmlSerializerNamespaces = Nothing
			If omitStandardNamespaces Then
				ns = New XmlSerializerNamespaces()
					' Disable the xmlns:xsi and xmlns:xsd lines.
				ns.Add("", "")
			End If
			Return obj.GetXml(ns)
		End Function

		<System.Runtime.CompilerServices.Extension> _
		Public Function GetXml(Of T)(obj As T, ns as XmlSerializerNamespaces) As String
			Using textWriter = New StringWriter()
				Dim settings = New XmlWriterSettings() With { _
					.Indent = True _
				}
				' For cosmetic purposes.
				Using xmlWriter = System.Xml.XmlWriter.Create(textWriter, settings)
					Dim serializer as New XmlSerializer(obj.GetType()) 
					serializer.Serialize(xmlWriter, obj, ns)
				End Using
				Return textWriter.ToString()
			End Using
		End Function

		<System.Runtime.CompilerServices.Extension> _
		Public Function GetOuterXml(node as XmlNode, Optional indent as Boolean = true) as String
			Using textWriter = New StringWriter()
				' For cosmetic purposes.
				Dim settings = New XmlWriterSettings() With { _
					.Indent = indent, _
					.OmitXmlDeclaration = true _
				}
				Using xmlWriter = System.Xml.XmlWriter.Create(textWriter, settings)
					node.WriteTo(xmlWriter)
				End Using
				Return textWriter.ToString()
			End Using		
		End Function
	End Module
;