开发时我喜欢为某些值设置强类型对象。一个例子可以是用户名。我已经设法通过构造函数中的业务规则验证来创建这些值对象(对象是不可变的),但是当我序列化这些对象时,它们表现得很时髦。
[DebuggerDisplay("{Value}")]
public class Username
{
private readonly string value;
public Username(string value)
{
if (string.IsNullOrEmpty(value))
throw new ArgumentException("value", "Must have a value");
if (value.Length > 50)
throw new ArgumentOutOfRangeException("value", "Maximum length of a username is 50");
this.value = value;
}
public string Value
{
get { return value; }
}
public static implicit operator string(Username username)
{
return username.Value;
}
public static explicit operator Username(string value)
{
return new Username(value);
}
}
我的问题是:使用像Newtonsoft Json.Net这样的序列化程序如何将这个值序列化为{ Username:"foobar" }
?
答案 0 :(得分:1)
从未尝试过,但我猜它支持类型转换器。
将TypeConverter属性添加到您的类并为其创建转换器(从字符串到用户名,反之亦然)
Newtonsoft.json.net似乎支持这个: http://www.symbolsource.org/Public/Metadata/Project/Json.NET/3.5-Release-6/Release/net-3.5/Newtonsoft.Json/Newtonsoft.Json/Utilities/ConvertUtils.cs
请参阅以。开头的代码部分 “//查看源类型或目标类型是否具有转换...的TypeConverter”
答案 1 :(得分:1)
你能解释'行为时髦'吗?
我没有使用Newtonsoft Json.Net的经验,但通常需要序列化/反序列化:
但是,我认为你在这里混淆了两个不同的问题:
在先前的评论中,您说:
...如果添加类型转换为我的所有 价值对象就是我的答案 质疑有价值的价值 我的代码中的对象......
这是一个有缺陷的结论,因为你有效地说:
“我需要VO,因为它们有助于确保系统完整性。但由于我无法使技术支持VO,我将忽略这个DDD概念,即我将忽略系统完整性强>“。
对您来说不是一个真正的答案,但希望它能帮助您识别真正的问题。