【问题标题】:Serialize Generic List using XML serializer .net c#使用 XML 序列化程序 .net c# 序列化通用列表
【发布时间】:2014-05-29 10:14:58
【问题描述】:

我正在尝试序列化通用列表,在 XML 序列化器中使用通用列表对象时出现错误,

我的通用列表类是,

 class CustomContact
    {
        private string[] number = new string[5];
        public string Name { get; set; }
        //public string Number { get; set; }
        public string[] Number
        {
            get { return number; }
            set { number = value; }
        }
       // public string Number1 { get; set; }

        public CustomContact()
        {
        }

        //CTOR that takes in a Contact object and extract the two fields we need (can add more fields)
        public CustomContact( Contact contact)
        {
            Name = contact.DisplayName;
            int count = contact.PhoneNumbers.Count();
            for (int i = 0; i < count; i++)
            {
                if (count > 0 && contact.PhoneNumbers.ElementAt(i).PhoneNumber != null && !string.IsNullOrEmpty(contact.PhoneNumbers.ElementAt(i).PhoneNumber))
                {
                    Number[i] = contact.PhoneNumbers.ElementAt(i).PhoneNumber.ToString();
                }
                else
                {
                   Number[i] = "";
                }
            }
            /*var number = contact.PhoneNumbers.FirstOrDefault();
                if (number != null)
                    Number = number.PhoneNumber;
                else
                    Number = "";*/
        }

通用列表的对象,

 List<CustomContact> listOfContacts  = new List<CustomContact>();

在 xml 序列化程序中使用此通用列表类的对象,

   XmlSerializer serializer = new XmlSerializer(typeof(List<CustomContact>)); 
                            using (XmlWriter xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
                            {
                                //CHANGE "App.MyStorage.Items" to where your data is.
                               // serializer.Serialize(xmlWriter, App.con.);
                                serializer.Serialize(xmlWriter, listOfContacts);
                            }

在这一行出现错误,

 XmlSerializer serializer = new XmlSerializer(typeof(List<CustomContact>)); 

错误是,

A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll

字符串类型的列表工作正常如何在此处运行通用列表?

希望您的建议谢谢

完全错误:

A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll

Additional information: Could not load file or assembly 'System.Xml.Serialization.debug.resources, Version=4.0.0.0, Culture=en-US, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

【问题讨论】:

  • FileNotFoundException 表明问题出在文件创建上,即stream 的来源;你确定你没有找错地方吗?是哪一行出错了?
  • 我已经提到了错误的行
  • 我在找对地方
  • 在您的代码中,class CustomContact 不是 publicXmlSerializer 需要)-我知道错误是切线的,但是如果您将课程设为 public,它会起作用吗?
  • @user3664724 class CustomContact 定义了 public 类型;如果它是顶级的,则为internal,如果它是嵌套的,则为privateXmlSerializer 需要 public

标签: c# asp.net .net xml-serialization generic-list


【解决方案1】:

保持您的客户类别如下所示。

public partial class customer
    {
        public string Name { get; set; }
        public int Number { get; set; }
    }

创建如下类

public class SerializeHelperImp
{

    public String SerializeToXmlString<T>(T toStringFromObject)
    {
        return SerializeToXmlString<T>(toStringFromObject, new UTF8Encoding());
    }

    public String SerializeToXmlString<T>(T toStringFromObject, Encoding encoding)
    {
        return DoSerializeToXmlString<T>(toStringFromObject, encoding);
    }

    public String SerializeToXmlString<T>(T toStringFromObject, Encoding encoding,
        XmlSerializerNamespaces namespaces)
    {
        return DoSerializeToXmlString<T>(toStringFromObject, encoding);
    }

    private String DoSerializeToXmlString<T>(T toStringFromObject, Encoding encoding)
    {
        String xmlstream = String.Empty;

        using (MemoryStream ms = new MemoryStream())
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof (T));
            XmlTextWriter xmlWriter = new XmlTextWriter(ms, encoding);

            xmlSerializer.Serialize(xmlWriter, toStringFromObject);
            xmlstream = ByteArrayToString(ms.ToArray(), encoding);
        }

        return xmlstream;
    }
     private String ByteArrayToString(Byte[] arrayOfBytes, Encoding encoding)
    {
        return encoding.GetString(arrayOfBytes);
    }
}

您可以编写如下方法。

private String SerializeToXmlString<T>(T objectToSerialise)
        {
            var serializeHelper = new SerializeHelperImp();
            return serializeHelper.SerializeToXmlString<T>(objectToSerialise, new UTF8Encoding());
        }

然后像下面这样调用上述方法并传递您的对象。

customer customerobject = new customer() { Name = "abc1",Number = 23};
 var stockServiceAsXmlString = SerializeToXmlString<customer>(customerobject);

working solution for this can be found here。希望这会对你有所帮助。

【讨论】:

  • 我是手动创建 xml 而不是序列化。这样您就可以完全掌握 xml 生成。
  • 希望这个答案能帮助你...@AK_
  • @AK_ 你能标记我的答案吗?我已经发布了工作解决方案。正如你所说,我已经编辑了我的答案。
  • @user3664724 嘿,我有有效的解决方案,您可以回复并标记我的解决方案。
猜你喜欢
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2011-06-28
  • 2011-05-12
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多