0

我有序列化的问题。我知道方法不能被序列化是有充分理由的,所以我创建了一个工厂类来将我现有的类转换为更易于管理的类。

这是原始类:

using Assets.Components;
using Assets.Data;
using IO.Components;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace Assets
{
[Serializable]
public class Asset
{

    #region Fields

    Metadata _metadata;
    string _fileName;
    string _companyId;

    #endregion

    #region Properties

    [Required]
    public string DisplayName { get; set; }
    public string Description { get; set; }
    public string Tags { get; set; }

    public int Id { get; set; }
    public int CategoryId { get; set; }
    public AssetType Type { get; set; }
    public int LanguageId { get; set; }
    public int StatusId { get; set; }

    public DateTime DateCreated { get; set; }
    public long DateCreatedMilliseconds { get { return DateCreated.ToJavaScriptMilliseconds(); } }

    public int Views { get; set; }
    public int Downloads { get; set; }

    public string ThumbNail { get; set; }

    public string Filename
    {
        set { _fileName = value; }
    }

    [Required]
    public string CompanyId
    {
        set { _companyId = value; }
    }


    public string GetBaseDirectory
    {
        get { return "/Public/Uploads/" + this._companyId + "/0"; }
    }

    public double Rating
    {
        get
        {
            List<int> Score = new List<int>();

            foreach (IRating oRating in this.Ratings())
            {
                Score.Add(oRating.Score);
            }

            return (Score.Count > 0) ? Score.Average() : 0;
        }
    }

    public Metadata Metadata
    {
        get
        {
            if (_metadata == null)
            {
                _metadata = new Metadata(this.Id);
                if (_metadata.AssetId == 0)
                {
                    try
                    {
                        if (GetFilename() != null)
                        {
                            string path = System.IO.Path.Combine(HttpContext.Current.Server.MapPath(this.GetBaseDirectory), GetFilename());
                            if (!System.IO.File.Exists(path))
                                _metadata = new Metadata();
                            else
                            {
                                _metadata = MetadataExtractor.Create(path, this.Id);
                                _metadata.save();
                            }
                        }
                        else
                        {
                            _metadata = new Metadata();
                        }
                    }
                    catch
                    {
                        _metadata = new Metadata();
                    }
                }
            }
            return _metadata;
        }
    }

    public bool IsConverted { get; set; }
    public string UserId { get; set; }

    public DateTime DateModified { get; set; }

    public long DateModifiedMilliseconds { get { return DateCreated.ToJavaScriptMilliseconds(); } }


    public string Culture { get; set; }
    public string Language { get; set; }

    public string UserName { get; set; }
    public string Email { get; set; }

    public int CategoryCount { get; set; }
    public int AssetCount { get; set; }

    public bool IgnoreRights { get; set; }

    #endregion

    #region Contructors

    /// <summary>
    /// Default constructor
    /// </summary>
    public Asset()
    {
    }

    /// <summary>
    /// Get's the asset from the database, but set's the status to the profiles Requires Approval state.
    /// </summary>
    /// <param name="Id">Asset Id</param>
    /// <param name="IsViewing">Boolean to update the reports table</param>
    /// <param name="IsDownloading">Boolean to update the reports table</param>
    public Asset(int Id, string UserId, string CompanyId, bool IsViewing, bool IsDownloading)
    {
        try
        {
            Asset oAsset = AssetData.GetAsset(Id, IsViewing, IsDownloading, UserId, CompanyId);          

            // Assign the values to this class
            this.Id = oAsset.Id;
            this.DisplayName = oAsset.DisplayName;

            this.IsConverted = oAsset.IsConverted;
            this.StatusId = oAsset.StatusId;
            this.Type = oAsset.Type;

            this.UserId = oAsset.UserId;
            this.UserName = oAsset.UserName;
            this.CompanyId = oAsset.GetCompanyId();

            this.Description = oAsset.Description;
            this.Tags = oAsset.Tags;

            this.LanguageId = oAsset.LanguageId;
            this.Culture = oAsset.Culture;
            this.Language = oAsset.Language;

            if (oAsset.ThumbNail != null) this.ThumbNail = oAsset.ThumbNail;
            this.Filename = oAsset.GetFilename();
            if (oAsset.Views != 0) this.Views = oAsset.Views;
            if (oAsset.Downloads != 0) this.Downloads = oAsset.Downloads;
        }
        catch (Exception ex)
        {
            Stars.BLL.Error.Handling.LogError("Skipstone", "Asset", "Asset", ex.Message, ex.ToString()); // Record our error
        }
    }

    /// <summary>
    /// Used for executing some of the public methods
    /// </summary>
    /// <param name="Id">Id of the asset to retrieve</param>
    /// <param name="CompanyId">The CompanyId of the company for the User</param>
    public Asset(int Id, string CompanyId)
    {
        this.Id = Id;
        this.CompanyId = CompanyId;
    }

    #endregion

    #region Public methods

    public string GetCompanyId()
    {
        return _companyId;
    }

    public string GetFilename()
    {
        return _fileName;
    }

    public string GetThumbnail()
    {
        return this.GetBaseDirectory + "/" + this.ThumbNail;
    }

    public string GetSmallThumbnail()
    {
        return this.GetBaseDirectory + "/sml_" + this.ThumbNail;
    }

    public Collection<IRating> Ratings()
    {
        Collection<IRating> oRatings = new Collection<IRating>();
        try
        {
            oRatings = RatingData.get(this.Id);
        }
        catch
        {
            // record our error
        }
        return oRatings;
    }

    public Collection<IComment> Comments()
    {
        Collection<IComment> oComments = new Collection<IComment>();
        try
        {
            oComments = CommentData.getAssetComments(this.Id);
        }
        catch (Exception ex)
        {
            // record our error
        }
        return oComments;
    }

    public void SaveMetadata()
    {
    }

    public Collection<GenericType> Categories()
    {
        return MiscellaneousManager.AssetCategories(this.Id, GetCompanyId());
    }

    public void Save()
    {
        if (this.Id > 0)
        {
            AssetData.update(this);
        }
        else
        {
            Asset oAsset = AssetData.create(this);
            this.Id = oAsset.Id;
            this.DisplayName = oAsset.DisplayName;
            this.Type = oAsset.Type;

            this.UserId = oAsset.UserId;
            this.CompanyId = oAsset.GetCompanyId();

            this.Description = oAsset.Description;
            this.Tags = oAsset.Tags;

            this.LanguageId = oAsset.LanguageId;
            this.Culture = oAsset.Culture;
            this.Language = oAsset.Language;

            if (oAsset.ThumbNail != null) this.ThumbNail = oAsset.ThumbNail;
            this.Filename = oAsset.GetFilename();
            if (oAsset.Views != 0) this.Views = oAsset.Views;
            if (oAsset.Downloads != 0) this.Downloads = oAsset.Downloads;
        }
    }

    public void delete()
    {
        AssetData.delete(this.Id);
        AssetManager.RemoveFromCache(this);
    }

    #endregion

}
}

这是我的工厂方法:

    private static SerialisedAsset AssetFactory(Assets.Asset Object)
    {
        SerialisedAsset FactoryObject = new SerialisedAsset()
        {
            Id = Object.Id,
            Name = Object.DisplayName,
            UserId = Object.UserId,
            UserName = Object.UserName,
            CompanyId = Object.GetCompanyId(),
            Description = Object.Description,
            Tags = Object.Tags,
            DateCreated = Object.DateCreated,
            Path = Object.GetBaseDirectory,
            FileName = Object.GetFilename(),
            ThumbnailName = Object.ThumbNail
        };

        return FactoryObject;
    }

这是我的 audittrailmanager 课程的一部分:

using Assets;
using Core;
using Reports.Objects;
using System;
using System.IO;
using System.Xml.Serialization;

namespace Reports.Components
{
public static class AuditTrailManager
{

    #region Public methods

    public static Audit AuditTrailFactory(Profile Profile, Object Object, Event Event)
    {
        Audit Audit = new Audit(SerializeObject(Object))
        {
            UserId = Profile.UserId,
            UserName = Profile.UserName,
            CompanyId = Profile.CompanyId,
            ObjectName = GetObjectNameFromType(Object.GetType().ToString()),
            Event = Event
        };

        return Audit;
    }

    #endregion

    #region Private methods

    private static string GetObjectNameFromType(string Type)
    {
        switch (Type)
        {
            case "Assets.Asset": return "Asset";
            case "Core.SiteSetting": return "CompanySettings";
        }

        return "";
    }

    private static string SerializeObject(Object Object)
    {
        string ObjectType = Object.GetType().ToString();

        switch (ObjectType)
        {
            case "Assets.Asset": return Serialize(AssetFactory((Asset)Object));
        }

        return ""; // If we fail
    }

    private static string Serialize(Object Object)
    {
        XmlSerializer ser = new XmlSerializer(Object.GetType());
        using (StringWriter Xml = new StringWriter())
        {
            ser.Serialize(Xml, Object);
            return (Xml.ToString());
        }
    }

    private static SerialisedAsset AssetFactory(Assets.Asset Object)
    {
        SerialisedAsset FactoryObject = new SerialisedAsset()
        {
            Id = Object.Id,
            Name = Object.DisplayName,
            UserId = Object.UserId,
            UserName = Object.UserName,
            CompanyId = Object.GetCompanyId(),
            Description = Object.Description,
            Tags = Object.Tags,
            DateCreated = Object.DateCreated,
            Path = Object.GetBaseDirectory,
            FileName = Object.GetFilename(),
            ThumbnailName = Object.ThumbNail
        };

        return FactoryObject;
    }

    #endregion

}
}

我要做的是创建一个审计跟踪,记录我正在处理的对象(在本例中是资产),我正在序列化该类并将其插入数据库以用于报告等。

我的问题是;这是这样做的方法吗?有没有更好的办法?

4

0 回答 0