使用SubSonic v2.x:第一个问题是所讨论的错误here:
'/ ......'应用程序中的服务器错误。 无法序列化System.Nullable类型的成员'.....'
我不确定从这篇文章中将代码放在我的DAL中的哪个位置才能使其正常工作。我尝试将它放在我为表创建的一个部分类中,但没有去。
另一个解决方法是添加:
generateNullableProperties = “假”
但是,对于我的DAL,我的子声道配置的提供者部分中的智能感知不是一个选项。 (它应该用于DAL配置或应用程序的配置?)
我设法绕过这个
[XmlElement(Type = typeof(TblReceiptLineItem))]
到以下代码:
public partial class TblReceipt
{
// no need to override any existing methods or properties as we
// are simply adding one
//[XmlElement]
// specifying the types of objects to be contained within the arraylist
[XmlElement(Type = typeof(TblReceiptLineItem))]
public ArrayList ReceiptLineItemsArr = new ArrayList();
public string UserPhoneNumber;
public string UserCardNumber;
}
...并且只是因为我将TblReceiptLineItem中的可空字段更改为不可为空。
但是,现在错误是:
无法将“System.Collections.ArrayList”类型的对象强制转换为“DAL.TblReceiptLineItem”。
所以我认为它还没有达到Nullable类型错误而且不喜欢演员。
那么序列化包含具有自定义类型的1 .. *元素的集合的对象的最佳方法是什么(即SubSonic友好的)。 什么是反序列化这些数据的最佳方法?
第二个(尚未)问题是,我有一个对象,其中一个成员中有一组对象。在序列化整个对象之前,是否必须在对象中序列化集合,或者XmlSerializer是否会处理所有这些?
谢谢。
==更新==
所以看起来这个问题实际上是通过我上面的小修复来解决的。我有一些其他错误的代码导致第二个错误。
但是,我的代码现在使用内部对象的数组列表完全序列化主对象。
所以修复是在声明之前添加类型:
[XmlElement(Type = typeof(TblReceiptLineItem))]
然而,欢迎更好的方法来完成这个(或其他)。
答案 0 :(得分:1)
问题1 - 我不知道
问题2 - 这取决于集合和对象。某些集合(ex Dictionary)不可序列化。如果集合是可序列化的,那么是的,整个对象图应该被序列化。当然,这也可能会因延迟装载而被扳回来。
修改强>
通常不适合你的任何理由?
[Serializable]
public partial class tblReciept
{
public List<TblReceiptLineItem> ReceiptLineItemsArr { get; set; }
}
[Serializable]
public class TblReceiptLineItem
{
public int ItemId { get; set; }
}
class Program
{
static void Main( string[] args )
{
var reciept = new tblReciept
{
ReceiptLineItemsArr = new List<TblReceiptLineItem>
{
new TblReceiptLineItem { ItemId = 1 },
new TblReceiptLineItem { ItemId = 222 },
new TblReceiptLineItem { ItemId = 156 }
}
};
XmlSerializer s = new XmlSerializer( typeof( tblReciept ) );
TextWriter w = new StreamWriter( @"c:\list.xml" );
s.Serialize( w, reciept );
w.Close( );
}
}
// output
<?xml version="1.0" encoding="utf-8"?>
<tblReciept xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ReceiptLineItemsArr>
<TblReceiptLineItem>
<ItemId>1</ItemId>
</TblReceiptLineItem>
<TblReceiptLineItem>
<ItemId>222</ItemId>
</TblReceiptLineItem>
<TblReceiptLineItem>
<ItemId>156</ItemId>
</TblReceiptLineItem>
</ReceiptLineItemsArr>
</tblReciept>
答案 1 :(得分:1)
很高兴你解决了这个问题 - 一般来说,在C#2.0中序列化可空类型的崩溃和灼伤 - 但如果它有效,就赶紧来吧!