小编noo*_*oon的帖子

JSON deseralization使用DataContractJsonSerializer抽象列表

我正在尝试将JSon文件反序列化为包含抽象列表的类的实例.将实例序列化到Json运行良好(检查下面的json文件).反序列化时,我得到一个带有"无法创建抽象类"消息的"System.MemberAccessException".显然,deseralizer试图实例化抽象类而不是具体类.

在我的示例中,反序列化的类称为ElementContainer:

namespace Data
{
    [DataContract]
    [KnownType(typeof(ElementA))]
    [KnownType(typeof(ElementB))]
    public class ElementContainer
    {
        [DataMember]
        public List<Element> Elements { get; set; }
    }

    [DataContract]
    public abstract class Element
    {
    }

    [DataContract]
    public class ElementA : Element
    {
        [DataMember]
        int Id { get; set; }
    }

    [DataContract]
    public class ElementB : Element
    {
        [DataMember]
        string Name { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是序列化的Json文件,我正在尝试反序列化.注意反序列化器的"__type"字段用于创建具体类:

{
    "Elements":
    [
        {
            "__type":"ElementA:#Data",
            "Id":1
        }, 
        {
            "__type":"ElementB:#Data",
            "Name":"MyName"
        }       
    ]
}
Run Code Online (Sandbox Code Playgroud)

以下是我用于反序列化的代码:

    public T LoadFromJSON<T>(string filePath)
    {
        try …
Run Code Online (Sandbox Code Playgroud)

c# serialization json list abstract

9
推荐指数
1
解决办法
8021
查看次数

C++事件系统设计

我需要在C++中使用事件系统.我主要有四个要求:

  1. 速度
  2. 便于使用
  3. 类型安全
  4. 友善的毁灭

通过"友好销毁"我的意思是事件和订户需要在其中一个被破坏时管理他们的断开连接:

  • 事件不应该调用已被销毁的订阅者.
  • 订阅者不应该从已销毁的事件中注销.

我想知道是否有人会有比我想象的更好的设计:

用户观点:

struct ClickEventArg {};

//-------------------------------------------------------------------------
class Button
{
public:
    Event<ClickEventArg&> Clicked;

    void SendClick(ClickEventArg& arg)
    {
        Clicked(this, arg);
    }
};

//-------------------------------------------------------------------------
class User
{
public:
    void Register(Button* button)
    {
        button->Clicked.Subscribe(m_suscriber, this, &User::OnButtonClicked);
    }

    void OnButtonClicked(void* sender, ClickEventArg& arg)
    {
        std::cout << "button clicked";
    }

private:
    EventSubscriber m_suscriber;
};

//-------------------------------------------------------------------------
void Test()
{
    Button* button = new Button();
    User* user = new User();
    user->Register(button);
    button->SendClick(ClickEventArg());
    delete user;
    button->SendClick(ClickEventArg()); 
}
Run Code Online (Sandbox Code Playgroud)

内部代码:

class EventSubscriber;

//------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

c++ events delegates

3
推荐指数
1
解决办法
1万
查看次数

标签 统计

abstract ×1

c# ×1

c++ ×1

delegates ×1

events ×1

json ×1

list ×1

serialization ×1