You could consider writing a complex user type (implementation of
IComplexUserType) that reads/writes the values of the object_type and
object_data columns and performs the serialization/deserialization.

Regards,
Gerke.

On Aug 23, 8:36 am, Wayne Douglas <[email protected]> wrote:
> Could you use discriminator?
>
> -----------------------------
> e-wayne <at> isit.gd
> t-07525 424 882
>
> On 23 Aug 2010, at 01:29, Geoff <[email protected]> wrote:
>
>
>
> > I have a plug-in infrastructure for a project I am working on. The
> > requirement is that I have a base class, that 3rd parties can
> > implement. I should be able to persist these 3rd party widgets to a
> > single table.
>
> > The idea is that I have a table in our database that looks like the
> > following:
>
> > (I couldn't upload an image of the table because my account is too
> > new. Instead here's the table's definition)
>
> > CREATE TABLE [dbo].[WIDGET](
> > [WIDGET_ID] [int] IDENTITY(1,1) NOT NULL,
> > [WIDGET_NAME] [nvarchar](25) NOT NULL,
> > [OBJECT_TYPE] [nvarchar](200) NOT NULL,
> > [OBJECT_DATA] [nvarchar](max) NOT NULL,
> >    CONSTRAINT [PK_WIDGET] PRIMARY KEY CLUSTERED([WIDGET_ID] ASC)
> > )
>
> > The code for this base class would be:
>
> > public abstract class Widget
> > {
> >  public int Id { get; private set; }
> >  public string Name { get; set; }
>
> >  protected Widget() { }
> >  protected Widget(int id)
> >  {
> >    Id = id;
> >  }
>
> >  public abstract void Render(TextWriter output);
> > }
>
> > The 3rd party widgets would derive from this class can be registered
> > with the application.
>
> > I need to be able to have NHibernate materialize a concrete instance
> > of the stored abstract widget by inspecting the OBJECT_TYPE field and
> > deserializing the value in the OBJECT_DATA field.
>
> > Some pseudo code for how I would achieve this out side of NHibernate
> > would look like:
>
> > public Widget DeserializeWidget(Type type, string objectData)
> > {
> >  //argument Type type == The type contained in the OBJECT_TYPE column
> >  //argument string objectData == The serialized data from the
> > OBJECT_DATA column
>
> >  DataContractJsonSerializer dcjs = new
> > DataContractJsonSerializer(type);
> >  Widget result = null;
>
> >  byte[] buffer = Encoding.UTF8.GetBytes(objectData);
>
> >  using (MemoryStream ms = new MemoryStream(buffer))
> >  {
> >    result = (Widget)dcjs.ReadObject(ms);
> >  }
> >  return result;
> > }
>
> > How can I inject the above code (and the inverse SerializeWidget) into
> > my NHibernate mappings when an HBL query returns a Widget entity?
>
> > Or is there a better way to do this with NHibernate, being that I have
> > no idea of the shape of the concrete widgets that my application needs
> > to persist?
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "nhusers" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to 
> > [email protected].
> > For more options, visit this group 
> > athttp://groups.google.com/group/nhusers?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to