C#-在序列化和反序列化之间跟踪变量的自动递增

本文关键字:变量 跟踪 序列化 反序列化 之间 C#- | 更新日期: 2023-09-27 18:28:38

我正在处理一个项目,需要有关自动递增ID字段的帮助。

就序列化而言,当涉及到静态变量的反序列化时,从上次序列化ID时获得ID的最佳方式是什么?在类的每次实例化时,您都会自动递增静态变量。

例如。。。

[Serializable]
class Category
{
    private static int iCatID = 0;
    private int iCategoryID;
    private string sCategory;
    public Category(string _sCategory)
    {
        iCatID++;
        iCategoryID = iCatID;
        sCategory = _sCategory;
    }
}

我艰难地学会了,在创建了这个类的5个左右的实例后,我对它进行了序列化,然后进行了反序列化,并期望iCatID在我开始创建更多的类实例时恢复到它停止的位置,但它当然已经重置回0。

我想知道的是,如何在序列化和反序列化之间跟踪自动递增变量,以及最佳实践是什么?

我想了两种可能的方法:

  1. 序列化类时,将静态变量的值保存到全局设置中,然后再次获取该值,并在反序列化时从全局设置中设置静态变量
  2. 在反序列化类时,请使用linq查询该类的所有实例,并获得最高数量,然后相应地设置静态变量

我相信有一种更优雅的方式来处理这个问题。

任何帮助都将是伟大的,谢谢。

C#-在序列化和反序列化之间跟踪变量的自动递增

序列化是关于实例的。。。如果您拍摄了快照,则它将被存储,即

static int nextCatID;
private readonly int catID;
private string category;
...
public Category(string category)
{
    catID = Interlocked.Increment(ref nextCatID);
    this.category = category
}

这里catID是与单个实例相关的值,并且将被序列化和反序列化;当然,这可能会导致重复:如果您序列化项目1,然后反序列化它5次,那么您将多获得5个"项目1"。

如果您希望在反序列化期间设置值,您也可以这样做-只需将字段标记为非序列化:

static int nextCatID;
[NonSerialized]
private int catID;

并使用构造函数中的相同代码在序列化后回调中设置它(注意,因为回调是而不是构造函数,所以不能使用readonly):

[OnDeserialized()]
private void OnDeserialized(StreamingContext context)
{
    catID = Interlocked.Increment(ref nextCatID);
}

您可以:

private static long iCatID = DateTime.Utc.Ticks;

long中转换的当前时间(UTC)启动计数器。因此,在任何运行程序时,只要运气好(如果用户没有更改时钟),所有新ID都将>所有旧ID。

请注意,使用UTC可以抵抗夏令时间/冬季时间的变化。

另一种解决方案是简单地忘记Id而使用Guid

您通过Guid.NewGuid()生成它,它将是唯一的。唯一的问题是你刚刚失去了对商品的订购。你不能简单地比较两个Guid,然后说"这是新的,这是旧的"。你可以看出他们是平等的/不同的。