【发布时间】:2011-02-17 20:09:21
【问题描述】:
我在实现一些序列化/反序列化逻辑时遇到了一点问题。
我有几个类,每个类都采用不同类型的 Request 对象,都实现了一个通用接口并继承自默认实现:
我认为应该是这样的:
请求
interface IRequest
{
public String Action {get;set;}
}
class DefaultRequest : IRequest
{
public String Action {get;set;}
}
class LoginRequest : DefaultRequest
{
public String User {get;set;}
public String Pass {get;set;}
}
处理程序
interface IHandler<T>
{
public Type GetRequestType();
public IResponse HandleRequest(IModel model, T request);
}
class DefaultHandler<T> : IHandler<T> // Used as fallback if the handler cannot be determined
{
public Type GetRequestType()
{
return /* ....... how to get the Type of T? ((new T()).GetType()) ? .......... */
}
public IResponse HandleRequest(IModel model, T request)
{
/* ... */
}
}
class LoginHandler : DefaultHandler<LoginRequest>
{
public IResponse HandleRequest(IModel mode, LoginRequest request)
{
}
}
通话
class Controller
{
public ProcessRequest(String action, String serializedRequest)
{
IHandler handler = GetHandlerForAction(action);
IRequest request = serializer.Deserialize<handler.GetRequestType()>(serializedRequest);
handler(this.Model, request);
}
}
我认为的可能吗?
我目前的解决方案是每个处理程序都获取序列化的字符串,并自己负责反序列化。这不是一个好的解决方案,因为它包含重复的代码,每个 HandleRequest 方法的开头看起来都一样(FooRequest request = Deserialize(serializedRequest); + try/catch 和其他反序列化失败的错误处理)。
将类型信息嵌入到序列化数据中是不可能的,也不是有意的。
感谢任何提示。
【问题讨论】:
标签: c# serialization type-conversion