我正在尝试为MongoDB实现一个自定义序列化提供程序,当我在F#Interactive环境中使用它时,它工作得很好但是当我尝试将我的代码移植到我的MVC4应用程序时,它将无法工作,我真的无法弄清楚为什么它似乎没有使用序列化提供程序。问题在于区分联合Price
的序列化,如果不使用提供的自定义序列化提供程序,它将无法工作。无论如何这里是代码:
[<HandleError>]
type AdminController() =
inherit Controller()
member x.Index() = x.View()
member x.CreateProduct() = x.View()
[<HttpPost>]
member x.CreateProduct(model) =
if not x.ModelState.IsValid then x.View(box model) :> ActionResult
else
do DataContext.products.Insert
({ Id = ObjectId();
Name = model.Name;
Price = Regular model.Price
Pictures = model.Pictures;
Description = model.Description
Category = model.Category }) |> ignore
x.RedirectToAction("Index") :> ActionResult
序列化提供程序已在Global.fs
文件中注册,因此应在其他任何内容之前调用它。我还尝试使用Price
属性修饰BsonSerializer
DU,但这也不起作用。
修改
在玩了一下之后,事实证明问题并不在于它没有正确地序列化我的DUs问题在于它会根据它们是在FSI还是运行时实例化而不同地序列化DU。 / p>
例如,看起来像这样的DU:
type DiscriminatedUnion =
| CaseOne
| CaseTwo
将由FSI中的BsonSerializer进行序列化:{ "_t" : "CaseOne" }
,而在运行时它将像这样序列化:
{ "_t" : "CaseOne",
"IsCaseOne" : "true",
"IsCaseTwo" : "false",
"Tag" : 0
}
我不知道为什么,但我猜测F#编译器在运行时为了互操作目的而向DU添加了额外的信息,但这只是猜测..
无论如何所以问题实际上只是我混合了来自FSI的BSON序列化对象和来自F#编译器的BSON序列化对象。