我正在尝试将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++中使用事件系统.我主要有四个要求:
通过"友好销毁"我的意思是事件和订户需要在其中一个被破坏时管理他们的断开连接:
我想知道是否有人会有比我想象的更好的设计:
用户观点:
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)