讓我們從以下代碼開始(請注意注釋掉的塊):
public sealed class AnotherTest
{
public sealed class MyBagContainer<T>
{
[XmlArray("Bag", Namespace = "myNs"),
XmlArrayItem("li", Namespace = "myNs2")]
public List<T> Items { get; set; } = new List<T> { };
}
public sealed class MyListableObject1
{
[XmlElement(Namespace = "myNs3")]
public int SomeInt { get; set; }
}
public sealed class MyListableObject2
{
[XmlElement(Namespace = "myNs3")]
public bool SomeBool { get; set; }
}
public sealed class SomeObject
{
public SomeObject()
{
Xmlns.Add("myNs", "http://example.com/ns");
Xmlns.Add("myNs2", "http://example.com/ns2");
Xmlns.Add("myNs3", "http://example.com/ns3");
}
[XmlElement(Namespace = "myNs2")]
public MyBagContainer<MyListableObject1> MyBag1 { get; set; }
= new MyBagContainer<MyListableObject1>
{
Items =
{
{ new MyListableObject1 { SomeInt = 42 } },
{ new MyListableObject1 { SomeInt = 43 } }
}
};
[XmlElement(Namespace = "myNs2")]
public MyBagContainer<MyListableObject1> MyBag2 { get; set; }
= new MyBagContainer<MyListableObject1>
{
Items =
{
{ new MyListableObject1 { SomeInt = 44 } },
{ new MyListableObject1 { SomeInt = 45 } }
}
};
/*
[XmlElement(Namespace = "myNs2")]
public MyBagContainer<MyListableObject2> MyBag3 { get; set; }
= new MyBagContainer<MyListableObject2>
{
Items =
{
{ new MyListableObject2 { SomeBool = true } },
{ new MyListableObject2 { SomeBool = false } }
}
};
*/
[XmlNamespaceDeclarations]
public XmlSerializerNamespaces Xmlns { get; set; }
= new XmlSerializerNamespaces();
}
public void Run()
{
var obj = new SomeObject();
using var ms = new MemoryStream();
using var w = XmlWriter.Create(ms, new XmlWriterSettings
{
OmitXmlDeclaration = true,
Indent = true
});
new XmlSerializer(obj.GetType())
.Serialize(w, obj, obj.Xmlns);
var s = System.Text.Encoding.UTF8.GetString(ms.ToArray());
Console.WriteLine(s);
}
}
當你運行它時,它作業得很好。完全按照應有的方式創建一切:
?<SomeObject
xmlns:myNs="http://example.com/ns"
xmlns:myNs2="http://example.com/ns2"
xmlns:myNs3="http://example.com/ns3">
<MyBag1 xmlns="myNs2">
<Bag xmlns="myNs">
<li xmlns="myNs2">
<SomeInt xmlns="myNs3">42</SomeInt>
</li>
<li xmlns="myNs2">
<SomeInt xmlns="myNs3">43</SomeInt>
</li>
</Bag>
</MyBag1>
<MyBag2 xmlns="myNs2">
<Bag xmlns="myNs">
<li xmlns="myNs2">
<SomeInt xmlns="myNs3">44</SomeInt>
</li>
<li xmlns="myNs2">
<SomeInt xmlns="myNs3">45</SomeInt>
</li>
</Bag>
</MyBag2>
</SomeObject>
現在,取消注釋代碼塊并再次運行它。你會得到這個錯誤:
System.PlatformNotSupportedException:“不支持編譯 JScript/CSharp 腳本”
使用此堆疊跟蹤:
at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location)
at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace, String location)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)
at AnotherTest.Run() in AnotherTest.cs:line 92
顯然,這段代碼中沒有任何腳本。
我假設這是“你把我放在泡菜里,我可以序列化它,但我將如何反序列化它?”的一些一般錯誤。
有沒有辦法讓 XML 序列化與泛型一起作業?或者我是否必須手動構建檔案(即不使用類來定義結構,而是手動將專案添加到 XmlDocument。)
上面的結構必須保持原樣。我正在使用規范。
uj5u.com熱心網友回復:
實際上,在 XmlSerializer 遇到某些限制、歧義或不一致的幾種情況下,似乎會產生此錯誤。
在這里,它似乎是 XmlSerializer對 .NET6的限制(在 .NET Framework 上,您的代碼可以正常作業)。在沒有泛型和下面有不同的 XmlArray 宣告(“Bag1”和“Bag2”)的情況下,它可以作業:
public sealed class MyBagContainer1
{
[XmlArray("Bag1", Namespace = "myNs"),
XmlArrayItem("li", Namespace = "myNs2")]
public List<MyListableObject1> Items { get; set; } = new List<MyListableObject1> { };
}
public sealed class MyBagContainer2
{
[XmlArray("Bag2", Namespace = "myNs"),
XmlArrayItem("li", Namespace = "myNs2")]
public List<MyListableObject2> Items { get; set; } = new List<MyListableObject2> { };
}
具有相同名稱“Bag”的兩者都會產生相同的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/535005.html
上一篇:如何在C#中將方法AddStackExchangeRedisCache添加到IServiceCollection?
