Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC.NET网站上的XML对象ID生成问题与静态类有关_C#_Xml_Xml Serialization - Fatal编程技术网

C# MVC.NET网站上的XML对象ID生成问题与静态类有关

C# MVC.NET网站上的XML对象ID生成问题与静态类有关,c#,xml,xml-serialization,C#,Xml,Xml Serialization,情况: 我们目前有一个MVC网站,可以从xml模式到对象模型进行序列化和反序列化。其中一些对象的ID属性是xml中的一个属性 要求: 我们需要确保xml中的每个ID都是唯一的。对象以服务器端代码添加到我们的模式模型中,然后使用XMLSerializer进行序列化。这些对象ID必须在序列化之前设置,因为我们在构建序列化对象时在其他时间使用它们。因此,理想情况下需要在对象创建时设置它们 此对象模型也由与网站无关的代码使用,因为它由另一个DLL项目使用。因此,在对象中使用会话状态之类的东西来跟踪ID等

情况:

我们目前有一个MVC网站,可以从xml模式到对象模型进行序列化和反序列化。其中一些对象的ID属性是xml中的一个属性

要求:

我们需要确保xml中的每个ID都是唯一的。对象以服务器端代码添加到我们的模式模型中,然后使用XMLSerializer进行序列化。这些对象ID必须在序列化之前设置,因为我们在构建序列化对象时在其他时间使用它们。因此,理想情况下需要在对象创建时设置它们

此对象模型也由与网站无关的代码使用,因为它由另一个DLL项目使用。因此,在对象中使用会话状态之类的东西来跟踪ID等并不是一个真正的选项

限制: xmlserialiser似乎要求要序列化和反序列化的对象提供无参数构造函数。因此,我们不能强制我们的对象接受任何类型的IDGenerator。我想我们可以有两个构造函数,但程序员必须记住调用write构造函数

分辨率: 我们创建了一个静态类,用于对象模型的构造函数中。这将确保ID始终递增。这还意味着,当在代码中创建新对象时,我们不必像在构造函数创建时那样担心正在创建的ID

代码:

我们的问题: 问题似乎在于我们使用静态变量来包含用于创建ID的_value属性。因为这是在我们的网站上运行的,所以变量在所有用户之间共享,所以每次用户做某事时都会进行设置/重置调整。这会影响其他用户,即使他们的最大ID等完全不同

所需解决方案: 我们希望确保生成唯一的ID,但生成的ID仅基于当前用户的XML设置。因此,我们可能不想使用静力学。但是,我们不希望在继承自ObjectModel的每个对象上都明确地设置它,因为这意味着我们必须记住在每次创建新对象时设置ID

有人有什么想法能帮上忙吗?这有点难以解释,所以如果没有意义,让我知道,我会相应地更新

更新:

在莫滕斯,我现在使用联锁来增加变量计数器

更新:
我还可能指出,xml可能是在我们的环境之外生成的,因此我们最初无法控制针对ObjectModel模式元素存储的ID int值。

似乎过于复杂。为什么要重置最大值?为什么不同的客户端不能获得相同的id?简言之,你需要id或序列号吗?@HenkHolterman客户端是否获得相同的id并不重要,但是在某个时候id生成器将命中整数.Max值,因此我们需要以某种方式确保它是唯一的。通过让它只为用户使用,我想理论是它永远不会达到这个目标。还有,身份证,序列号,我想这并不重要。我们只需要整数在当前xml文档中是唯一的。只需使用一个简单的递增计数器。如果你点击MaxInt,你需要一个
长的
。这就解决了单服务器的问题。还要注意,“\u value++”不是线程安全的。使用Interlocked.Increment更新静态计数器变量。
 internal static class IdGenerator
{
    private static int Min = 0x8000; //0xA0000;
    private static int Max = 0xFFFF9;
    private static int _value = Min - 1;
    private static int _objectIterations = 0;

    public static int NextId()
    {
        if (_value < Max)
        {
            Interlocked.Increment(ref _value);
        }
        else
        {
            _value = Min;
        }
        return _value; 
    }

    /// <summary>
    /// Navigates the schema tree and returns the maxium value from properties identified with the SchemaObjectIdentity attribute
    /// </summary>
    /// <param name="scenario"></param>
    /// <returns></returns>
    public static void SetMinimumIdentity(ObjectModel analysis, int minimum)
    {
        int currentMax = minimum;
        PropertyMax<ObjectModel>(analysis, ref currentMax);

        if (_value < currentMax)
            _value = currentMax + 1;
    }
}
    public partial class ObjectModel
    {
       public OverseerObjectIDType()
       {
         ID = IdGenerator.NextId();
       }
    }