这是我的程序 -
module Program
open System
open System.IO
open System.Text
open System.Xml
open System.Xml.Serialization
open System.Runtime.Serialization
open System.Reflection
open Microsoft.FSharp.Reflection
let getUnionTypes<'a> () =
let nestedTypes = typedefof<'a>.GetNestedTypes(BindingFlags.Public ||| BindingFlags.NonPublic)
Array.filter FSharpType.IsUnion nestedTypes
type Alpha =
{ X : int * int
Y : Alpha option }
type [<KnownType "GetTypes">] Beta =
| A of int * Alpha
| B of Beta option
| C of Map<int, Beta>
static member GetTypes () = getUnionTypes<Beta> ()
let [<EntryPoint>] main _ =
let alpha = { X = (0, 0); Y = Some { X = (1, 1); Y = None }}
let betaA = A (0, alpha)
let betaB = B (Some betaA)
let betaC = C (Map.singleton 0 betaB)
let sb = new StringBuilder()
let xmlSerializer = DataContractSerializer(typeof<Beta>);
xmlSerializer.WriteObject(new XmlTextWriter(new StringWriter(sb)), betaC)
let sr = sb.ToString()
printfn "%A" sr
0
这是输出 -
"<Program.Beta xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:type="Progr
am.Beta.C" xmlns="http://schemas.datacontract.org/2004/07/"><item xmlns:d2p1="ht
tp://schemas.datacontract.org/2004/07/Microsoft.FSharp.Collections"><d2p1:serial
izedData xmlns:d3p1="http://schemas.datacontract.org/2004/07/System.Collections.
Generic"><d3p1:KeyValuePairOfintProgram.BetalLTIrbuF><d3p1:key>0</d3p1:key><d3p1
:value i:type="Program.Beta.B"><item xmlns:d6p1="http://schemas.datacontract.org
/2004/07/Microsoft.FSharp.Core"><d6p1:value i:type="Program.Beta.A"><item1>0</it
em1><item2><X_x0040_ xmlns:d9p1="http://schemas.datacontract.org/2004/07/System"
><d9p1:m_Item1>0</d9p1:m_Item1><d9p1:m_Item2>0</d9p1:m_Item2></X_x0040_><Y_x0040
_><d6p1:value><X_x0040_ xmlns:d11p1="http://schemas.datacontract.org/2004/07/Sys
tem"><d11p1:m_Item1>1</d11p1:m_Item1><d11p1:m_Item2>1</d11p1:m_Item2></X_x0040_>
<Y_x0040_ i:nil="true" /></d6p1:value></Y_x0040_></item2></d6p1:value></item></d
3p1:value></d3p1:KeyValuePairOfintProgram.BetalLTIrbuF></d2p1:serializedData></i
tem></Program.Beta>"
我可以做哪些简单的事情来改进这个 XML 输出?我尝试了各种属性,但似乎都没有帮助。请注意,我需要保持我的数据结构不可变,并且我希望避免编写我自己的序列化库,或者尽可能将依赖项添加到另一个自制程序库。理想情况下,它应该是一个简单的解决方案。