SubSonic - 使用Nullable类型和集合序列化类?

时间:2009-12-10 01:14:10

标签: .net subsonic xml-serialization nullable

使用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))]

然而,欢迎更好的方法来完成这个(或其他)。

2 个答案:

答案 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中序列化可空类型的崩溃和灼伤 - 但如果它有效,就赶紧来吧!