繁体   English   中英

XML反序列化C#

[英]XML Deserialization C#

我试图将XML文件反序列化为我的Windows窗体应用程序的Program文件中的对象,如下所示:

            List<UserAccessGroup> AccessGroups = new List<UserAccessGroup>();

            AccessGroups = SerializerHelper.DeSerializeObject<List<UserAccessGroup>>(@"C:\Users\Michael"
            + @"\Google Drive\FDM Dev Course Content\Workspace\SystemAdmin\SystemAdmin\"
            + @"XML Data Store\UserAccessGroups.xml");

            UserAccessGroup SystemAdmin_App = new UserAccessGroup();

            foreach (UserAccessGroup group in AccessGroups)
            {
                if (group.Name.Equals("Admin Operators"))
                {
                    SystemAdmin_App = group;
                }
            }

当我运行此代码时,我在foreach循环中收到一个未处理的异常,指出Access Groups为null。

但是,当我将这段代码复制并粘贴到空白控制台应用程序中时,它运行正常,当我检查具有断点的AccessGroups时,它有4个成员,如预期的那样。

任何人都可以告诉我为什么反序列化不能在我的程序文件中工作?

另外,这是我的XML文件:

<?xml version="1.0"?>
<ArrayOfUserAccessGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserAccessGroup>
    <Name>Admin Operators</Name>
    <Access_Group>
      <int>999</int>
    </Access_Group>
  </UserAccessGroup>
  <UserAccessGroup>
    <Name>Shareholders</Name>
    <Access_Group />
  </UserAccessGroup>
  <UserAccessGroup>
    <Name>Brokers</Name>
    <Access_Group />
  </UserAccessGroup>
  <UserAccessGroup>
    <Name>StockExMgrs</Name>
    <Access_Group />
  </UserAccessGroup>
</ArrayOfUserAccessGroup>

编辑:忘了包含我用于序列化/反序列化的SerializerHelper类,请看下面:

    public static class SerializerHelper
    {
        /// <summary>
        /// Serializes an object.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serializableObject"></param>
        /// <param name="fileName"></param>

        private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(
            "SerializerHelper.cs");

        public static void SerializeObject<T>(string filepath, T serializableObject)
        {
            if (serializableObject == null) { return; }

            try
            {
                XmlDocument xmlDocument = new XmlDocument();
                XmlSerializer serializer = new XmlSerializer(serializableObject.GetType());
                using (MemoryStream stream = new MemoryStream())
                {
                    serializer.Serialize(stream, serializableObject);
                    stream.Position = 0;
                    xmlDocument.Load(stream);
                    xmlDocument.Save(filepath);
                    stream.Close();
                }
            }
            catch (Exception ex)
            {
                //Log exception here
                logger.Error("Error Serializing: " + ex.Message);
            }
        }


        /// <summary>
        /// Deserializes an xml file into an object list
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static T DeSerializeObject<T>(string filepath)
        {
            T objectOut = default(T);

            if (!System.IO.File.Exists(filepath)) return objectOut;

            try
            {
                string attributeXml = string.Empty;

                XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.Load(filepath);
                string xmlString = xmlDocument.OuterXml;

                using (StringReader read = new StringReader(xmlString))
                {
                    Type outType = typeof(T);

                    XmlSerializer serializer = new XmlSerializer(outType);
                    using (XmlReader reader = new XmlTextReader(read))
                    {
                        objectOut = (T)serializer.Deserialize(reader);
                        reader.Close();
                    }

                    read.Close();
                }
            }
            catch (Exception ex)
            {
                //Log exception here
                logger.Error("Error Deserializing: " + ex.Message);
            }

            return objectOut;
        }
    }

编辑:下面的UserAccessGroup类:

    [Serializable]
    public class UserAccessGroup : IUserAccessGroup
    {
        private String name;

        private List<int> AccessGroup = new List<int>();

        public String Name
        {
            get { return name; }
            set { name = value; }
        }

        public List<int> Access_Group
        {
            get { return AccessGroup; }
            set { AccessGroup = value; }
        }

        public UserAccessGroup()
        {
        }

        public UserAccessGroup(String name)
        {
            this.name = name;
        }

        public List<int> getUserIDs()
        {
            return AccessGroup;
        }

        public void removeUser(int userID)
        {
            AccessGroup.Remove(userID);
            return;
        }

        public void addUser(int userID)
        {
            AccessGroup.Add(userID);
            return;
        }
    }

主要问题可归纳为:

T objectOut = default(T);

if (!System.IO.File.Exists(filepath)) return objectOut;

try
{
    // ...
}
catch (Exception ex)
{
    //Log exception here
    logger.Error("Error Deserializing: " + ex.Message);
}

return objectOut;

(请注意, T=List<UserAccessGroup> default(T)null

所以:对于AccessGroupsnull ,发生了两件事之一:

  • 该文件不存在(因此代码在顶部附近退出)
  • 抛出异常

检查每一个。 如果第一个:添加它。 如果第二个:读取.Message ,和.InnerException.Message等( XmlSerializer在内部异常上非常大)

XmlSerializer不会为列表/数组的根对象返回null ,因此:它是这两件事之一。

在不存在的returncatch放置一个断点,你应该找到正在发生的事情。 或者,查看logger写入的位置。 当文件不存在时,也可能添加写入logger的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM