我想重写ASP.NET JavaScriptSerializer类的Serialize方法。没什么太花哨的,我只想对从.NET返回的序列化字符串做一些额外的后处理。
不幸的是,这个类中没有一个方法被声明为虚拟,并且类本身不是从接口或抽象类派生的(考虑到有多少核心.NET Framework类是为可扩展性而设计的,这似乎是一种奇怪的疏忽)。
根据我对这个主题所做的一些阅读,看来我有几个选择可供选择。
创建扩展方法。我不是这个选项的忠实粉丝,因为它涉及创建一个新的方法(编译器不允许使用相同的名称/签名两次),类消费者需要知道。
从JavaScriptSerializer派生一个具有完全相同签名的新类。由于JavaScriptSerializer没有虚方法,我会在每个方法/属性声明中使用“new”关键字来执行方法隐藏。我认为这个选项被认为是一个装饰模式?
创建一个名为IJavaScriptSerializer的新接口,该接口与JavaScriptSerializer具有相同的签名。删除我的代码中的所有引用到JavaScriptSerializer并替换为对新创建的接口的引用。
我很想知道其他方法以及每种方法的优点/缺点。
感谢您花时间阅读。
答案 0 :(得分:3)
你误解了Decorator Pattern,它指的是一个继承一个类并包装该类的另一个实例的对象。 (这对于流非常常见)。在你的情况下,它不适用。
我建议你为JavaScriptSerializer
类自己替换(或者你需要的包装器),而不是尝试使用相同的API。如果你需要能够交换实现,我会用核心方法创建一个接口或基类,并有两个具体的实现,一个包装原始,一个添加后处理。
通常,在设计类时,您应该设计满足您的需求,而不是复制.Net Framework的内置类。
答案 1 :(得分:0)
转到http://json.org并删除具有源代码的几个类之一,用于JSON序列化。
然后,进行后期处理,编译并在项目中使用。
理想情况下,此时我会创建一个扩展方法,所以我可以这样做:
List<MyObject> s = fillObject();
return s.ToJSON();