序列化后如何保留对同一对象的两个引用

时间:2019-01-18 15:19:54

标签: c# asp.net serialization control-state

让我们假设一个像Foo这样的类

[Serializable]
class Foo{
     int Id { get; set; }
     String Property1 { get ;set; }
     String Property2 { get ;set; }
}

我有一个自定义的ASP控件,例如

class MyControl : CompositeControl {
     object MyObject { get; set; }
     string PropertyName { get; set; }
}

我有一个类似ASPX的页面

<MyControl id="mycontrol1" MyObject="<%# MyFoo %>" PropertyName="Property1"></MyControl>     
<MyControl id="mycontrol2" MyObject="<%# MyFoo %>" PropertyName="Property2"></MyControl>     

//code behind
Foo MyFoo { get; set; } 

protected override void OnInit(EventArgs e){
   if (Page.IsPostBack) return;

    //retrieve from Db:
    MyFoo = new Foo {
            Id = 123,
            Property1 = "Hello",
            Property2 = "World"
    };
}

该控件用于更改PropertyName指定的属性,假设该控件仅向该属性添加*,则可以正常工作。我使用控制状态在回发之间存储实体。而且这里出错了。

我创建了一个对象Foo。

我将此对象绑定到两个控件

两个控件都将实体序列化为其控件状态

两个控件均在属性中添加*。 (前端)

回发后,两个控件均从其控件状态反序列化对象。

我最终遇到两个对象:

//In mycontrol1.MyFoo
{
   Id = 123,
   Property1 = "Hello*",
   Property2 = "World"
}

//In mycontrol2.MyFoo
{
   Id = 123,
   Property1 = "Hello",
   Property2 = "World*"
}

我打算让两个实例都引用同一个对象。

//mycontrol1.MyFoo and
//mycontrol2.MyFoo both referring to 
{
   Id = 123,
   Property1 = "Hello*",
   Property2 = "World*"
}

我完全理解为什么会这样,但是我不知道如何将其存档。

编辑: 我认为使用ASP和contol状态实际上没什么可看的。我认为可以在序列化部分中解决。我只需要做的就是使两个控件都使用共享的序列化器,并让该对象理解如果它已经使用给定的ID序列化了一个对象,则需要返回相同的对象。

如果这需要类似的接口,那就可以接受。

interface IFoo {
    int Id {get; set;}
}

1 个答案:

答案 0 :(得分:0)

您可以将检索结果包装在另一个缓存层中。

例如 基于Property1,Property2覆盖Foo上的比较 创建一个包含Foo对象的全局HashSet 创建一个将Foo作为输入并返回Foo的函数

该函数将查看哈希集中是否已经有Foo,如果没有,它将添加它。 该函数将始终从HashSet返回Foo的实例。

所以最后你可以说 var Foo = GetFooFromSomewhere(); var MyFooInstance = MyFooCache.GetFoo(Foo);