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。
我想知道的是,如何在序列化和反序列化之间跟踪自动递增变量,以及最佳实践是什么?
我想了两种可能的方法:
- 序列化类时,将静态变量的值保存到全局设置中,然后再次获取该值,并在反序列化时从全局设置中设置静态变量
- 在反序列化类时,请使用linq查询该类的所有实例,并获得最高数量,然后相应地设置静态变量
我相信有一种更优雅的方式来处理这个问题。
任何帮助都将是伟大的,谢谢。
序列化是关于实例的。。。如果您拍摄了快照,则它将被存储,即
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
,然后说"这是新的,这是旧的"。你可以看出他们是平等的/不同的。