簡體   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