wpr*_*prl 7 c# nhibernate web-services proxy-classes xml-serialization
我有一些Web方法将我的对象作为序列化XML返回.它只是序列化对象的NHibernate映射属性......任何人都有一些洞察力?似乎Web方法实际上是序列化NHibernate代理而不是我的类.我尝试过使用[XMLInclude]和[XMLElement],但属性仍然没有序列化.我有一种非常可怕的hackish方式绕过这个,但我想知道是否有更好的方法!
像这样的东西:
<?xml version="1.0" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="StoryManager" assembly="StoryManager">
<class name="Graphic" table="graphics" lazy="false">
<id name="Id" column="id" type="int" unsaved-value="0" >
<generator class="identity"/>
</id>
<property name="Assigned" />
<property name="Due" />
<property name="Completed" />
<property name="UglyHack" insert="false" update="false" />
<many-to-one name="Parent" class="Story" column="story_id"/>
</class>
</hibernate-mapping>
public class Graphic
{
private int m_id;
public virtual int Id
{
get { return m_id; }
set { m_id = value; }
}
private DateTime? m_assigned;
public virtual DateTime? Assigned
{
get { return m_assigned; }
set { m_assigned = value; }
}
private DateTime? m_due;
public virtual DateTime? Due
{
get { return m_due; }
set { m_due = value; }
}
private DateTime? m_completed;
public virtual DateTime? Completed
{
get { return m_completed; }
set { m_completed = value; }
}
public bool UglyHack
{
get { return m_due < m_completed; } // return something besides a real mapped variable
set {} // trick NHibernate into thinking it's doing something
}
}
Run Code Online (Sandbox Code Playgroud)
这显然无法编写代码.如果我没有那里的"假"映射(UglyHack属性),那么该属性将不会被序列化.现在我正在研究使用(数据)传输对象,并可能使用反射...
sir*_*cco 21
序列化NH映射对象的最佳方法是不对其进行序列化:).
如果您通过网络发送它,您应该真正为它创建一个DTO.如果您不想创建该对象,可以在不希望序列化的属性上设置[XmlIgnore].
如果你想要所有的属性,你必须从数据库加载它们 - 对于一些急切的加载对于其他人来说已经足够了(其中有太多的连接将开始复制数据)你必须以任何你想要的方式访问该属性触发负载.
编辑:
而且我想补充一点 - 通过网络发送域名实体总是一个坏主意.在我的情况下,我学习了很难的方法 - 我通过WebService公开一些实体 - 现在几乎任何更改(重命名属性,删除属性..etc)到我的域使用WS杀死应用程序 - 加上一大堆属性上有[XmlIgnore](不要忘记循环依赖).
我们很快就会重写 - 但请确保这不是我再做过的事情.:)
编辑2
您可以使用AutoMapper将数据从实体传输到DTO.他们在网站上有一些例子.
| 归档时间: |
|
| 查看次数: |
7731 次 |
| 最近记录: |