我将所有对WCF web服务的请求(包括参数)记录到数据库中。我是这样做的:
- 创建一个类WcfMethodEntry,它派生自PostSharp的aspect OnMethodBoundaryAspect,
- 用WcfMethodEntry属性注释所有WCF方法,
- 在WcfMethodEntry中,我用JsonConvert将方法参数序列化为json。SerializeObject方法并将其保存到数据库。
这工作正常,但有时参数相当大,例如一个自定义类与几个字节数组的照片,指纹等。我想从序列化中排除所有字节数组数据类型,最好的方法是什么?
json序列化示例:
[
{
"SaveCommand":{
"Id":5,
"PersonalData":{
"GenderId":2,
"NationalityCode":"DEU",
"FirstName":"John",
"LastName":"Doe",
},
"BiometricAttachments":[
{
"BiometricAttachmentTypeId":1,
"Parameters":null,
"Content":"large Base64 encoded string"
}
]
}
}
]
所需输出:[
{
"SaveCommand":{
"Id":5,
"PersonalData":{
"GenderId":2,
"NationalityCode":"DEU",
"FirstName":"John",
"LastName":"Doe",
},
"BiometricAttachments":[
{
"BiometricAttachmentTypeId":1,
"Parameters":null,
"Content":"..."
}
]
}
}
]
编辑:我不能改变被用作web服务方法参数的类-这也意味着我不能使用JsonIgnore属性。
下面的命令允许您从生成的json中排除您想要排除的特定数据类型。它的使用和实现非常简单,并改编自底部的链接。
你可以使用这个,因为你不能改变实际的类:
public class DynamicContractResolver : DefaultContractResolver
{
private Type _typeToIgnore;
public DynamicContractResolver(Type typeToIgnore)
{
_typeToIgnore = typeToIgnore;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
properties = properties.Where(p => p.PropertyType != _typeToIgnore).ToList();
return properties;
}
}
用法和示例:
public class MyClass
{
public string Name { get; set; }
public byte[] MyBytes1 { get; set; }
public byte[] MyBytes2 { get; set; }
}
MyClass m = new MyClass
{
Name = "Test",
MyBytes1 = System.Text.Encoding.Default.GetBytes("Test1"),
MyBytes2 = System.Text.Encoding.Default.GetBytes("Test2")
};
JsonConvert.SerializeObject(m, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new DynamicContractResolver(typeof(byte[])) });
输出:{
"Name": "Test"
}
更多信息可以在这里找到:
减少序列化JSON的大小
您可以使用[JsonIgnore]来指定这个属性。
[JsonIgnore]
public Byte[] ByteArray { get; set; }
通过自定义属性(json.net)
另一种方法是使用自定义类型转换器并让它返回null,因此属性在那里,但它将只是null。
例如,我使用这个,以便我可以序列化异常:
/// <summary>
/// Exception have a TargetSite property which is a methodBase.
/// This is useless to serialize, and can cause huge strings and circular references - so this converter always returns null on that part.
/// </summary>
public class MethodBaseConverter : JsonConverter<MethodBase?>
{
public override void WriteJson(JsonWriter writer, MethodBase? value, JsonSerializer serializer)
{
// We always return null so we don't object cycle.
serializer.Serialize(writer, null);
}
public override MethodBase? ReadJson(JsonReader reader, Type objectType, MethodBase? existingValue, bool hasExistingValue,
JsonSerializer serializer)
{
return null;
}
}
尝试使用JsonIgnore
属性