zoukankan      html  css  js  c++  java
  • XmlSerializer 序列化和反序列化

    XmlSerializer的序列化就是把一个对象的public属性(有Get和Set)和public字段保存到一个xml文件,反序列化就是从一个xml文件得到一个特定的类的实例对象。

    Classifieds的程序里面的一些设置就是用序列化技术保存在xml文件里面的。这个类就是 SiteSettings。

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.IO;
    using System.Text;
    using System.Xml.Serialization;

    using AspNet.StarterKits.Classifieds.Web;

    namespace AspNet.StarterKits.Classifieds.BusinessLogicLayer
    {
        /// <summary>
        /// Contains the implementation for the site settings.
        /// </summary>
        public class SiteSettings
        {

            private const string XmlConfigFile = "~/App_Data/site-config.xml";

            private int _maxPhotosPerAd;
            private bool _storePhotosInDatabase;
            private string _serverPhotoUploadDirectory;

            private bool _adApprovalRequired;
            private bool _allowUsersToEditAds;
            private bool _allowUsersToDeleteAdsInDB;

            private int _maxAdRunningDays;
            private AdminNotificationSetting _adminNotification;
            private string _siteName;
            private string _siteEmail;

            public bool AllowImageUploads
            {
                get
                {
                    return (_maxPhotosPerAd > 0);
                }

            }
            public int MaxPhotosPerAd
            {
                get
                {
                    return _maxPhotosPerAd;
                }
                set
                {
                    lock (this)
                    {
                        _maxPhotosPerAd = value;
                    }
                }
            }

            public bool StorePhotosInDatabase
            {
                get
                {
                    return _storePhotosInDatabase;
                }
                set
                {
                    lock (this)
                    {
                        _storePhotosInDatabase = value;
                    }
                }

            }

            public string ServerPhotoUploadDirectory
            {
                get
                {
                    return _serverPhotoUploadDirectory;
                }
                set
                {
                    lock (this)
                    {
                        _serverPhotoUploadDirectory = value;
                    }
                }

            }

            public bool AdActivationRequired
            {
                get
                {
                    return _adApprovalRequired;
                }
                set
                {
                    lock (this)
                    {
                        _adApprovalRequired = value;
                    }
                }

            }
            public bool AllowUsersToEditAds
            {
                get
                {
                    return _allowUsersToEditAds;
                }
                set
                {
                    lock (this)
                    {
                        _allowUsersToEditAds = value;
                    }
                }
            }
            public bool AllowUsersToDeleteAdsInDB
            {
                get
                {
                    return _allowUsersToDeleteAdsInDB;
                }
                set
                {
                    lock (this)
                    {
                        _allowUsersToDeleteAdsInDB = value;
                    }
                }
            }
            public int MaxAdRunningDays
            {
                get
                {
                    return _maxAdRunningDays;
                }
                set
                {
                    lock (this)
                    {
                        _maxAdRunningDays = value;
                    }
                }

            }

            [System.ComponentModel.TypeConverter(typeof(System.ComponentModel.EnumConverter))]
            public AdminNotificationSetting AdminNotification
            {
                get
                {
                    return _adminNotification;
                }
                set
                {
                    lock (this)
                    {
                        _adminNotification = value;
                    }
                }

            }

            public string SiteName
            {
                get
                {
                    return _siteName;
                }
                set
                {
                    lock (this)
                    {
                        _siteName = value;
                    }
                }
            }

            public string SiteEmailAddress
            {
                get
                {
                    return _siteEmail;
                }
                set
                {
                    lock (this)
                    {
                        _siteEmail = value;
                    }
                }
            }

            public string SiteEmailFromField
            {
                get
                {
                    return String.Format("{0} <{1}>", _siteName, _siteEmail);
                }
            }

            public static SiteSettings LoadFromConfiguration()
            {
                SiteSettings s = LoadFromXml();

                if (s == null)
                {
                    s = new SiteSettings();
                    s.MaxPhotosPerAd = 5;
                    s.StorePhotosInDatabase = true;
                    s.ServerPhotoUploadDirectory = "Upload";
                    s.AdActivationRequired = false;
                    s.AllowUsersToEditAds = true;
                    s.AllowUsersToDeleteAdsInDB = true;
                    s.MaxAdRunningDays = 21;
                    s.AdminNotification = AdminNotificationSetting.None;
                    s.SiteName = "ASP.NET Classifieds";
                    s.SiteEmailAddress = "classifieds@yoursite.com";
                    SaveToXml(s);
                }
                return s;
            }

            public static SiteSettings GetSharedSettings()
            {
                return ClassifiedsHttpApplication.ClassifiedsApplicationSettings;
            }

            public static bool UpdateSettings(SiteSettings newSettings)
            {
                // write settings to code or db

                // update Application-wide settings, only over-writing settings that users should edit
                lock (ClassifiedsHttpApplication.ClassifiedsApplicationSettings)
                {
                    // Ads must be activated before appearing on the site
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.AdActivationRequired = newSettings.AdActivationRequired;

                    // Store Photos in Database
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.StorePhotosInDatabase = newSettings.StorePhotosInDatabase;
                    // ... else: use the following directory to save uploaded Photos:
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.ServerPhotoUploadDirectory = newSettings.ServerPhotoUploadDirectory;

                    // Maximum Number of Photos to Upload
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.MaxPhotosPerAd = newSettings.MaxPhotosPerAd;
                    // Maximum Number of Days for which an Ad is active
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.MaxAdRunningDays = newSettings.MaxAdRunningDays;

                    // Allow Users to edit their own Ads
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.AllowUsersToEditAds = newSettings.AllowUsersToEditAds;

                    // Users to delete ads direclty in the database
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.AllowUsersToDeleteAdsInDB = newSettings.AllowUsersToDeleteAdsInDB;

                    // Notifications to Administrators
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.AdminNotification = newSettings.AdminNotification;

                    // Site Name
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.SiteName = newSettings.SiteName;

                    // Contact Email Address for Site
                    ClassifiedsHttpApplication.ClassifiedsApplicationSettings.SiteEmailAddress = newSettings.SiteEmailAddress;

                    // Serialize to Xml Config File
                    return SaveToXml(ClassifiedsHttpApplication.ClassifiedsApplicationSettings);
                }
            }

            private static SiteSettings LoadFromXml()
            {
                SiteSettings settings = null;

                HttpContext context = HttpContext.Current;
                if (context != null)
                {
                    string configPath = context.Server.MapPath(XmlConfigFile);

                    XmlSerializer xml = null;
                    FileStream fs = null;

                    bool success = false;
                    int numAttempts = 0;

                    while (!success && numAttempts < 2)
                    {
                        try
                        {
                            numAttempts++;
                            xml = new XmlSerializer(typeof(SiteSettings));
                            fs = new FileStream(configPath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
                            settings = xml.Deserialize(fs) as SiteSettings;
                            success = true;
                        }
                        catch (Exception x)
                        {
                            // if an exception is thrown, there might have been a sharing violation;
                            // we wait and try again (max: two attempts)
                            success = false;
                            System.Threading.Thread.Sleep(1000);
                            if (numAttempts == 2)
                                throw new Exception("The Site Configuration could not be loaded.", x);
                        }
                    }

                    if (fs != null)
                        fs.Close();
                }

                return settings;

            }

            public string GetXml()
            {
                StringBuilder result = new StringBuilder();
                StringWriter s = new StringWriter(result);
                try
                {
                    XmlSerializer xml = new XmlSerializer(typeof(SiteSettings));
                    xml.Serialize(s, this);
                }
                finally
                {
                    s.Close();
                }
                return result.ToString();

            }

            private static bool SaveToXml(SiteSettings settings)
            {
                if (settings == null)
                    return false;

                HttpContext context = HttpContext.Current;
                if (context == null)
                    return false;

                string configPath = context.Server.MapPath(XmlConfigFile);

                XmlSerializer xml = null;
                System.IO.FileStream fs = null;

                bool success = false;
                int numAttempts = 0;

                while (!success && numAttempts < 2)
                {
                    try
                    {
                        numAttempts++;
                        xml = new XmlSerializer(typeof(SiteSettings));
                        fs = new FileStream(configPath, FileMode.Create, FileAccess.ReadWrite, FileShare.None);
                        xml.Serialize(fs, settings);
                        success = true;
                    }
                    catch
                    {
                        // if an exception is thrown, there might have been a sharing violation;
                        // we wait and try again (max: two attempts)
                        success = false;
                        System.Threading.Thread.Sleep(1000);
                    }
                }

                if (fs != null)
                    fs.Close();

                return success;

            }
        }
    }

  • 相关阅读:
    路由器安全-FPM
    网络基础设施保护和局域网安全
    DMVPN基础配置
    IPSec的链路和设备备份
    IPSec的高可用性技术
    关于Mobility Express转LAP注意事项
    实际中可能遇到的NAT问题(IPsec)
    NAT-T和PAT(IPSec)
    加密设备NAT对IPSec的影响
    影响IPSec的网络问题
  • 原文地址:https://www.cnblogs.com/asdio/p/1408228.html
Copyright © 2011-2022 走看看