2

我有一组对象,它们需要在上次更新对象中的某些属性时维护几个时间戳(每个属性一个时间戳)。

我只会在设置器中实现时间戳更新,除了使用的反序列化库首先创建一个对象,然后更新其所有属性(使用对象的设置器)。这意味着每次我的程序反序列化它们时,我的所有时间戳都会失效。

我在想我需要一个单例类或一些更新方法来处理更新属性并控制时间戳更新。有没有更好的方法来实现这种行为?这种行为是否存在设计模式?

4

1 回答 1

2

如果您将序列化问题与业务层分开,它应该有助于您找到一些灵活性来制定解决方案。让您的 99% 的 API 与您的业务对象(属性更新时更新时间戳)一起工作,然后仅出于序列化目的与某些数据传输对象 (DTO) 进行转换

例如,给定一些像这样的业务对象:

public class MyObject
{
    public DateTime SomeValueUpdated { get; private set; }

    private double _SomeValue;
    public double SomeValue
    {
        get
        {
            return _SomeValue;
        }
        set
        {
            SomeValueUpdated = DateTime.Now;
            _SomeValue = value;
        }
    }

    public MyObject()
    {

    }

    //for deserialization purposes only
    public MyObject(double someValue, DateTime someValueUpdated)
    {
        this.SomeValue = someValue;
        this.SomeValueUpdated = someValueUpdated;
    }
}

你可以有一个匹配的 DTO,如下所示:

public class MyObjectDTO
{
    public DateTime SomeValueUpdated { get; set; }
    public double SomeValue { get; set; }
}

您的 DTO 可以特别装饰各种 XML 模式更改属性,或者您可以管理时间戳,但您认为合适,而您的业务层不知道也不关心。

当需要序列化或反序列化对象时,请通过转换器实用程序运行它们:

public static class MyObjectDTOConverter
{
    public static MyObjectDTO ToSerializable(MyObject myObj)
    {
        return new MyObjectDTO {
            SomeValue = myObj.SomeValue,
            SomeValueUpdated = myObj.SomeValueUpdated
        };
    }

    public static MyObject FromSerializable(MyObjectDTO myObjSerialized)
    {
        return new MyObject(
            myObjSerialized.SomeValue, 
            myObjSerialized.SomeValueUpdated
        );
    }
}

如果您愿意,您可以将 的任何属性或构造函数设置为MyObjectinternal以便只有您的转换实用程序可以访问它们。(例如,也许您不想让public MyObject(double someValue, DateTime someValueUpdated)构造函数公开访问)

于 2013-08-27T00:34:31.190 回答