从WebService返回自定义类的实例时,有哪些序列化选项?
我们有一些具有许多子集合类属性的类以及根据用途可能设置也可能不设置的其他属性.这些对象是从装有ScriptService属性的ASP.NET .asmx WebService返回的,因此在各种WebMethods返回时通过JSON序列化进行序列化.
问题是开箱即用的序列化会返回所有公共属性,无论它们是否被使用,以及以比您想要限制的数量更加详细的方式返回类名和其他信息.交通.
目前,对于返回的类,我们添加了处理JSON序列化的自定义javascript转换器,并将它们添加到web.config中,如下所示:
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization>
<converters>
<add name="CustomClassConverter" type="Namespace.CustomClassConverter" />
</converters>
</jsonSerialization>
</webServices>
</scripting>
</system.web.extensions>
Run Code Online (Sandbox Code Playgroud)
但这需要每个类的自定义转换器.有没有其他方法可以通过扩展服务,创建自定义序列化器等来改变开箱即用的JSON序列化?
跟进
@marxidad:
我们在其他应用程序中使用DataContractJsonSerializer类,但是我无法弄清楚如何将它应用于这些服务.以下是如何设置服务的示例:
[ScriptService]
public class MyService : System.Web.Services.WebService
{
[WebMethod]
public CustomClass GetCustomClassMethod
{
return new customClass();
}
}
Run Code Online (Sandbox Code Playgroud)
WebMethods由javascript调用,并返回以JSON序列化的数据.我们能够更改序列化的唯一方法是使用上面引用的javascript转换器?
有没有办法告诉WebService使用自定义DataContractJsonSerializer?是否通过web.config配置,使用属性装饰服务等?
更新
嗯,我们找不到任何方法来切换开箱即用的JavaScriptSerializer,除了如上所述创建单独的JavaScriptConverters.
为此我们为防止必须创建单独的转换器而做的是创建一个通用的JavaScriptConverter.我们为我们想要处理的类添加了一个空接口,在web-service启动时调用的SupportedTypes使用反射来查找实现接口的任何类型,如下所示:
public override IEnumerable<Type> SupportedTypes
{
get
{
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
AssemblyBuilder dynamicAssemblyCheck = assembly as AssemblyBuilder;
if (dynamicAssemblyCheck == null)
{
foreach (Type type in assembly.GetExportedTypes())
{
if (typeof(ICustomClass).IsAssignableFrom(type))
{
yield …Run Code Online (Sandbox Code Playgroud) 有没有办法通过System.Reflection,System.Diagnostics或其他方法来获取对调用静态方法的实际实例的引用,而不将其传递给方法本身?
例如,沿着这些方向的东西
class A
{
public void DoSomething()
{
StaticClass.ExecuteMethod();
}
}
class B
{
public void DoSomething()
{
SomeOtherClass.ExecuteMethod();
}
}
public class SomeOtherClass
{
public static void ExecuteMethod()
{
// Returns an instance of A if called from class A
// or an instance of B if called from class B.
object caller = getCallingInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用System.Diagnostics.StackTrace.GetFrames获取类型,但有没有办法获得对实际实例的引用?
我知道反射和性能的问题,以及静态到静态调用的问题,并且这通常,甚至可能几乎是不一致的,而不是正确的方法来解决这个问题.这个问题的部分原因是我很好奇它是否可行; 我们目前正在传递实例.
ExecuteMethod(instance)
Run Code Online (Sandbox Code Playgroud)
我只是想知道这是否可行并且仍然能够访问该实例.
ExecuteMethod()
Run Code Online (Sandbox Code Playgroud)
@Steve Cooper:我没有考虑扩展方法.一些变化可能会奏效.
这个问题在LINQ to SQL .dbml最佳实践的问题中得到了解决,但我不确定如何添加问题.
我们的一个应用程序使用LINQ to SQL,我们目前有一个.dbml文件用于整个数据库,这个文件变得难以管理.我们正在考虑将它重构为更多模块/功能特定的单独文件,但是一个问题是许多高级类必须在几个.dbml文件中重复,因为这些关联不能跨越. dbml文件(据我所知),还有附加的部分类代码.
有没有人在努力解决这个问题,你会提出什么建议?