- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 DataContractJsonSerializer 类将对象列表输出为 json 格式,但是我一直遇到以下错误。
Type 'Castle.Proxies.JokeCategoryProxy' with data contract name
'JokeCategoryProxy:http://schemas.datacontract.org/2004/07/Castle.Proxies'
is not expected. Consider using a DataContractResolver or add any types not
known statically to the list of known types - for example, by using the
KnownTypeAttribute attribute or by adding them to the list of known
types passed to DataContractSerializer.
我知道之前已经回答过这个问题,但它似乎只有在我的对象中有一个属性是另一个自定义对象时才会发生。
[DataContract]
[KnownType(typeof(ModelBase<int>))]
public class Joke : ModelBase<int>
{
[DataMember]
public virtual string JokeText { get; set; }
[DataMember]
public virtual JokeCategory JokeCategory { get; set; }
}
[DataContract]
[KnownType(typeof(ModelBase<int>))]
public class JokeCategory : ModelBase<int>
{
[DataMember]
public virtual string Name { get; set; }
}
如您所见,笑话模型包含一个笑话类别对象,如果我删除笑话类别并只使用一个 int (JokeCategoryId),错误就会消失,尽管这是一个解决方案,但不是理想的解决方案,因为我希望拥有类别无需再次查询即可获得。
下面是我用来生成json的代码
public static ContentResult JsonResponse<TReturnType>(this Controller controller, TReturnType data)
{
using (var oStream = new System.IO.MemoryStream())
{
new DataContractJsonSerializer(typeof(TReturnType)).WriteObject(oStream, data);
return new ContentResult
{
ContentType = "application/json",
Content = Encoding.UTF8.GetString(oStream.ToArray()),
ContentEncoding = Encoding.UTF8
};
}
}
最让我困惑的是错误引用了 CaSTLe.Proxies.JokeCategoryProxy(这是从哪里来的?!)
有什么建议吗?
最佳答案
nHibernate 假定您的所有属性,除非另有说明,都是延迟加载的。
这意味着,在您的情况下,无论何时拉取 Joke
对象,都不会从数据库中拉取 JokeCategory
;相反,“代理”是动态生成的。
第一次访问该属性时,nHibernate 知道从数据库中提取它。 (这就是 nHib 的延迟加载的工作原理)
所以基本上这里发生的事情是您希望您的 JokeCategory
是 JokeCategory
类型,但由于它没有真正初始化 - 它是 类型代理...
。
(这只是一个简短的解释;在 google 上搜索更多关于 nHib 及其工作原理的信息。您还可以查看 summer of nhibernate 以了解有关此 ORM 的精彩介绍)
而且,对于你的问题:你在这里有几个选择:
将您的 Category 属性配置为非惰性,这将强制 nHibernate 使用正确的对象类型对其进行初始化
(在我看来更可取)不要序列化您的模型实体;相反 - 构建某种 DTO 来保存您的表示层需要的任何信息。
这样,您的演示文稿就不会受到域模型更改的影响,反之亦然。
此外,您可以在 DTO 中保存所有必要的信息,即使它与多个模型实体相关。
例如:
public class JokeDTO
{
public int JokeId;
/*more Joke properties*/
public int JokeCategoryId;
public string JokeCategoryName;
/*etc, etc..*/
}
关于c# - 自定义类包含另一个自定义类时的 DataContractResolver/KnownType 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6622806/
我们有一个抽象类,它是我们通过 WCF 服务发送的许多不同请求的基础。每次我们添加新请求时,我们都必须记住添加 [KnownType],这是一个丑陋的令人发指的 hack。属性到这个基类。 有没有办法
我有这个 Web Api Controller 操作: public Plant GetPlant(string plant, string range) { return _repo.Get
我已经阅读了很多关于已知类型的文章,我相信我的例子应该有效。但事实并非如此。我在反序列化时遇到以下异常,但不明白为什么: 第 1 行位置 2 中的错误。需要来自命名空间“http://schemas.
我只见过它被用来“克服”OOP 和 SOp 之间的差异> 最佳答案 我不认为这是黑客行为。唯一不太适合我的是,在使用继承时必须将属性附加到基类,以告诉基类派生哪些类型。这有点颠倒,但可以通过编程来完成
我在不需要了解任何其他项目的项目 (Comp.DataContracts) 中有一个数据契约(Contract)。我有引用 Comp.DataContracts 的 Comp.ProjA 并且有一个派
我正在尝试反序列化来自 google api 的 json 响应,所以我想我会定义几个类来帮助它: [DataContract] public class DetectionResult:Respon
是否有一种普遍接受的方法来避免必须在 WCF 服务上使用 KnownType 属性?我一直在做一些研究,看起来有两种选择: Data contract resolver NetDataContract
看了MSDN引用,对于什么时候使用KnownType属性,我还是有疑问。我知道该属性将类型信息传递给序列化程序,但什么时候需要这样做?当被序列化的类具有基类类型的引用并且存在可以设置为这些引用的向上转
我有几个 WCF 数据契约(Contract)如下: [DataContract] public class Hatchback: Car {
我正在尝试在 WCF 外部使用 DataContractSerializer 来序列化一个对象。本例中的对象继承自 CollectionBase 周围的旧通用包装器,例如 [KnownType(typ
我正在尝试使用 DataContractJsonSerializer 类将对象列表输出为 json 格式,但是我一直遇到以下错误。 Type 'Castle.Proxies.JokeCategoryP
我正在使用 WCF 检索对象集合。这些对象都是 ProcedureText 类型,但可能属于继承自 ProcedureText 的子类 SuspensionText 或 ResumptionText。
我正在将远程处理接口(interface)转换为 WCF,但是我有一个方法声明为返回“对象”并且可以返回许多不同的类型(主要是不同的枚举) 我在哪里可以找到处理此问题的示例? (我正在使用一个包含所有
我正在创建一个 WCF 服务,但我在一些序列化问题上遇到了很多麻烦。也许只有一种方法可以做到,但我想确认一下这是我的示例代码: 契约(Contract) public interface IAtm
因此,我们试图弃用一些现有的类,并开始使用 ObsoleteAttribute 将它们标记为过时,以便停止使用它们。将 KnownType 属性与标有 Obsolete 属性的类型一起使用并导致编译器
我正在尝试在我当前的 Servicestack 实现中支持 MessagePack 协议(protocol)。我需要它来支持(反)序列化这样定义的 ISegment 列表: [KnownType(ty
我正在尝试为任意对象生成 KnownType 列表,但在尝试使用通用成员序列化类型时遇到了问题,例如 DbEntityValidationException它具有 IEnumerable 类型的列表属
使用 protobuf-net.dll 2.0.0.431 我正在尝试使用 [DataContract] 和 [DataMember] 序列化类层次结构。 [DataContract] [KnownT
我有一个 WCF 服务,它带有元数据的 mex 端点。我通过 visual studio 使用 SvcUtil 在服务运行时生成客户端数据契约(Contract)代码 (C#)。 SvcUtil 为继
我正在尝试创建一个函数来从我的 MongoDB 集合中检索数据。为此,我构建了一个返回 List 的通用方法。 . 我的问题是我必须创建这个 List返回,但我这样做是基于 typeof T .我不确
我是一名优秀的程序员,十分优秀!