我有一个对象,我使用ServiceStack.Text命名空间中的ToJson<>()
方法反序列化。
如何在序列化期间省略所有GET
唯一的属性?是否有任何属性,如[Ignore]
或我可以用我的属性装饰,以便可以省略它们?
由于
答案 0 :(得分:51)
ServiceStack's Text serializers遵循.NET的DataContract序列化程序行为,这意味着您可以使用选择退出[IgnoreDataMember]
属性
public class Poco
{
public int Id { get; set; }
public string Name { get; set; }
[IgnoreDataMember]
public string IsIgnored { get; set; }
}
选择加入替代方法是用[DataMember]
装饰要序列化的每个属性。其余属性未序列化,例如:
[DataContract]
public class Poco
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
public string IsIgnored { get; set; }
}
最后,还有一个不需要属性的非侵入式选项,例如:
JsConfig<Poco>.ExcludePropertyNames = new [] { "IsIgnored" };
ServiceStack的Serializers还支持通过提供常规命名的ShouldSerialize({PropertyName})
方法来动态控制序列化,以指示属性是否应该被序列化,例如:
public class Poco
{
public int Id { get; set; }
public string Name { get; set; }
public string IsIgnored { get; set; }
public bool? ShouldSerialize(string fieldName)
{
return fieldName == "IsIgnored";
}
}
中的更多示例
答案 1 :(得分:0)
对于可以为空的成员,您还可以在序列化之前将其设置为null。
如果要创建一个重用于多个API调用的单个视图/ api模型,这将非常有用。在将其设置在响应对象上之前,该服务可以触摸它。
示例:
public SignInPostResponse Post(SignInPost request)
{
UserAuthentication auth = _userService.SignIn(request.Domain, true, request.Username, request.Password);
// Map domain model ojbect to API model object. These classes are used with several API calls.
var webAuth = Map<WebUserAuthentication>(auth);
// Exmaple: Clear a property that I don't want to return for this API call... for whatever reason.
webAuth.AuthenticationType = null;
var response = new SignInPostResponse { Results = webAuth };
return response;
}
我希望有一种方法可以动态控制每个端点方式的所有成员(包括不可空)的序列化。