我正在开发一个Entity Framework项目.我想序列化一堆实体类实例.我将它们绑定到一个容器类中:
public class Pseudocontext
{
public List<Widget> widgets;
public List<Thing> things;
Run Code Online (Sandbox Code Playgroud)
Etcetera ......这是我正在尝试序列化的这个类的一个实例.我希望JSON.NET序列化每个实体类实例的成员,这些实体实际上是底层数据库中的列.我不希望它甚至尝试序列化对象引用.
特别是,我的实体类有虚拟成员,允许我编写C#代码,导航我所有的实体间关系,而不用担心实际的键值,连接等,我希望JSON.NET忽略我的实体的相关部分类.
从表面上看,似乎有一个JSON.NET配置选项正是我所说的:
JsonSerializer serializer = new JsonSerializer();
serializer.PreserveReferencesHandling = PreserveReferencesHandling.None;
Run Code Online (Sandbox Code Playgroud)
不幸的是,JSON.NET似乎忽略了上面的第二个声明.
我实际上找到了一个网页(http://json.codeplex.com/workitem/24608),其中有人将同样的问题提请James Newton-King本人注意,他的回答(完整的)是"写一个定制合同解析员."
尽管我发现回应不足,但我一直试图遵循其指导.我非常希望能够编写一个"契约解析器",它忽略除了原始类型,字符串,DateTime对象和我自己的Pseudocontext类以及它直接包含的列表之外的所有内容.如果某人有一个至少类似的东西的例子,那可能就是我所需要的.这就是我自己提出的:
public class WhatDecadeIsItAgain : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
JsonContract contract = base.CreateContract(objectType);
if (objectType.IsPrimitive || objectType == typeof(DateTime) || objectType == typeof(string)
|| objectType == typeof(Pseudocontext) || objectType.Name.Contains("List"))
{
contract.Converter = base.CreateContract(objectType).Converter;
}
else
{
contract.Converter = myDefaultConverter;
}
return contract;
}
private static …Run Code Online (Sandbox Code Playgroud) 看起来这应该很简单,我认为这是......直到我从运行Figwheel切换到运行JAR文件并且它停止工作.
问题可以简化为一个非常简单的例子:
使用Leiningen"Reagent"模板制作一个名为"buttontest"的新应用.
在"ns"声明下面的core.cljs中添加一些脚本:
(defn greet [] (js/alert "Hi!"))
Run Code Online (Sandbox Code Playgroud)
在handler.clj中添加一个静态按钮:
(defn loading-page [] (html5 (head)
[:body {:class "body-container"} mount-target
;v v v INSERTED THIS
[:button {:onclick "buttontest.core.greet()"} "Say Hello"]
;^ ^ ^
(include-js "/js/app.js")]))
Run Code Online (Sandbox Code Playgroud)
做一次"lein cljsbuild"和"lein figwheel".浏览到该网站."Say Hello"按钮将在单击时触发警报.
回到shell中,执行"lein uberjar"并使用Java运行生成的.JAR文件.浏览到该网站.单击时,"Say Hello"按钮将不执行任何操作.控制台显示"buttontest未定义".
我尝试了各种各样的东西(修改/删除"onclick"属性中的命名空间限定,手动包括其他.JS文件等),没有运气.我觉得我错过了一些明显的东西.
有任何想法吗?谢谢.