我有一个应用程序需要序列化自定义对象并将其发送到Windows服务,自定义对象包含2个自定义对象列表和一个int,string字典。当我尝试序列化对象时,我收到错误消息:
There was an error generating the XML document.
我已经google了一下,发现这通常是由于其中一种数据类型没有正确设置序列化。所以我已经完成并验证了所有自定义类的序列化,据我所知,它已正确设置。
现在我的问题是,默认情况下列表和词典是否可序列化,或者为了序列化它们需要做些什么?或者,是否有更好的方法来序列化可执行文件之间传递的自定义对象集合?
编辑:
主要自定义类:
[Serializable]
class MoveInInfoRequest : ServerRequestData
{ }
[Serializable]
[XmlInclude(typeof(GetUnitTypesResponseData)), XmlInclude(typeof(VendorObj.RequiredFields)),
XmlInclude(typeof(VendorObj.InsuranceChoice)), XmlInclude(typeof(VendorObj.ProrateSettings))]
public class MoveInInfoResponse : ServerResponseData
{
public GetUnitTypesResponseData UnitTypesInfo
{ get; set; }
public List<VendorObj.RequiredFields> RequiredFields
{ get; set; }
public Dictionary<int, String> RentalPeriods
{ get; set; }
public List<VendorObj.InsuranceChoice> InsCoverageAmounts
{ get; set; }
public VendorObj.ProrateSettings ProrateOptions
{ get; set; }
}
Sampple Sub类:其他两个类的设置与此类似,但它们只使用默认数据类型。
<Serializable(), DataContract([Namespace]:="*companyNamespace*")> _
Public Class InsuranceChoice
Public Sub New()
End Sub
<DataMember()> _
Public InsuranceChoiceID As Integer
<DataMember()> _
Public CoverageDescription As String
<DataMember()> _
Public Premium As Decimal
<DataMember()> _
Public ActualCoverageAmount As Decimal
End Class
答案 0 :(得分:1)
这取决于您尝试将它们序列化的内容。特别是,如果您使用XmlSerializer
,则Dictionary对象不可序列化,但如果您使用的是DataContractSerializer
,则它们就是可序列化的。您应该可以序列化List。
如果您想要替代Xml序列化,可以使用Json.Net序列化为JSON。
参考文献:
Serialize Class containing Dictionary member
Why doesn't XmlSerializer support Dictionary?
http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/
答案 1 :(得分:1)
在序列化方面,这是一个非常普遍的问题。
实施IDictionary
cannot be serialized
您可以使用DataContractSerializer,但更好的解决方案(在我看来)是创建自己的Dictionary类,它不会继承自IDictionary
可以找到此类的一个示例here
在解决方案中实现了类之后,只需执行以下操作:
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var response = new MoveInInfoResponse
{
RentalPeriods = new SerializableDictionary<int, string>
{ { 1, "Period 1" }, { 2, "Period 2" } }
};
string xml = Serialize(response);
}
static string Serialize(Object obj)
{
var serializer = new XmlSerializer(obj.GetType());
var settings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true };
using (var stream = new StringWriter())
{
using (var writer = XmlWriter.Create(stream, settings))
serializer.Serialize(writer, obj);
return stream.ToString();
}
}
}
[Serializable]
public class MoveInInfoResponse
{
public SerializableDictionary<int, String> RentalPeriods
{ get; set; }
}
}
生成以下XML文件:
<MoveInInfoResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<RentalPeriods>
<Item>
<Key>
<int>1</int>
</Key>
<Value>
<string>Period 1</string>
</Value>
</Item>
<Item>
<Key>
<int>2</int>
</Key>
<Value>
<string>Period 2</string>
</Value>
</Item>
</RentalPeriods>
</MoveInInfoResponse>