MongoDB没有正确地序列化我的类型

时间:2015-03-25 19:30:26

标签: mongodb asp.net-mvc-4 serialization f#

我正在尝试为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序列化对象。

0 个答案:

没有答案