Josep Alacid
Josep Alacid

Reputation: 1092

Serializing properties

I have searched everywhere in CF docs, FAQ's, Blog and SO entries but still can't understand why this model:

    <cf:project defaultNamespace="Humanisme" xmlns:cf="http://www.softfluent.com/codefluent/2005/1" xmlns:cfx="http://www.softfluent.com/codefluent/modeler/2008/1" xmlns:cfom="http://www.softfluent.com/codefluent/producers.model/2005/1" xmlns:cfps="http://www.softfluent.com/codefluent/producers.sqlserver/2005/1" xmlns:cfsm="http://www.softfluent.com/codefluent/producers.servicemodel/2007/1" defaultKeyPropertyTypeName="int" defaultMaxLength="240" persistencePropertyNameFormat="{1}" createDefaultMethodForms="true" createDefaultApplication="false" createDefaultHints="false">
  <cf:import path="Default.Surface.cfp" />
  <cf:producer name="Business Object Model (BOM)" typeName="CodeFluent.Producers.CodeDom.CodeDomProducer, CodeFluent.Producers.CodeDom">
    <cf:configuration compileWithVisualStudio="true" compile="false" codeDomProviderTypeName="CSharp" targetDirectory="..\Humanisme.classes" produceWebMembershipProvider="false" produceWebProfileProvider="false" produceWebBasicAuthenticationModule="false" cfx:targetProject="..\Humanisme.classes\Humanisme.classes.csproj" cfx:targetProjectLayout="Update">
      <subProducer typeName="CodeFluent.Producers.ServiceModel.ServiceProducer, CodeFluent.Producers.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1bb6d7cccf1045ec" compileWithVisualStudio="true" compile="false" codeDomProviderTypeName="CSharp" targetDirectory="..\Humanisme.webApi" silverlightTargetVersion="Unspecified" dataAnnotationsProductionModes="NoAnnotations, All" jsonOptions="EnableJson" outputName="HumanismeService" cfx:targetProject="..\Humanisme.webApi\Humanisme.webApi.csproj" cfx:targetProjectLayout="Update" produceProxy="False" />
    </cf:configuration>
  </cf:producer>

(....)

<cf:entity name="EtapaVital" namespace="Humanisme" categoryPath="/Humanisme">
    <cf:property name="Id" key="true" />
    <cf:property name="Nom" />
    <cf:property name="Idioma" typeName="{0}.EtapaVitalIdiomaCollection" relationPropertyName="Etapa" />
    <cf:property name="Documents" typeName="{0}.DocumentCollection" relationPropertyName="EtapaVital" />
  </cf:entity>

Renders to these serializing attributes:

  1. RowVersion and EntityState get the serializing attributes.
  2. EntityDisplayName does not.

    [System.Runtime.Serialization.DataMemberAttribute(Order=2147483647)]
    private CodeFluent.Runtime.CodeFluentEntityState _entityState;
    
            public EtapaVital()
    
            [System.Runtime.Serialization.DataMemberAttribute()]
            public virtual string EntityKey
            {
                get
                {
                    return this.Id.ToString();
                }
                set
                {
                    this.Id = ((int)(ConvertUtilities.ChangeType(value, typeof(int), -1)));
                }
            }
    
            public virtual string EntityDisplayName
            {
                get
                {
                    return this.Nom;
                }
            }
    
            [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
            [System.ComponentModel.DataObjectFieldAttribute(false, true)]
            [System.ComponentModel.TypeConverterAttribute(typeof(CodeFluent.Runtime.Design.ByteArrayConverter))]
            [System.Runtime.Serialization.DataMemberAttribute()]
            public byte[] RowVersion
            {
                get
                {
                    return this._rowVersion;
                }
                set
                {
                    if (((value != null) 
                                && (value.Length == 0)))
                    {
                        value = null;
                    }
                    this._rowVersion = value;
                    this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("RowVersion"));
                }
            }
    
            [System.ComponentModel.DefaultValueAttribute(((int)(-1)))]
            [System.Xml.Serialization.XmlElementAttribute(IsNullable=false, Type=typeof(int))]
            [System.ComponentModel.DataObjectFieldAttribute(true)]
           [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=100)]
            public int Id
            {
                get
                {
                    return this._id;
                }
                set
                {
                    if ((System.Collections.Generic.EqualityComparer<int>.Default.Equals(value, this._id) == true))
                    {
                        return;
                    }
                    int oldKey = this._id;
                    this._id = value;
                    try
                    {
                        this.OnCollectionKeyChanged(oldKey);
                    }
                    catch (System.ArgumentException )
                    {
                        this._id = oldKey;
                        return;
                    }
                    this.EntityState = CodeFluent.Runtime.CodeFluentEntityState.Modified;
                    this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Id"));
                }
            }
    
            [System.ComponentModel.DefaultValueAttribute(default(string))]
            [System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Type=typeof(string))]
            [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=200)]
            public string Nom
            {
                get
                {
                    return this._nom;
                }
                set
                {
                    this._nom = value;
                    this.EntityState = CodeFluent.Runtime.CodeFluentEntityState.Modified;
                    this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Nom"));
                }
            }
    
            [System.Xml.Serialization.XmlIgnoreAttribute()]
            public Humanisme.EtapaVitalIdiomaCollection Idioma
            {
                get
                {
                    if ((this._idioma == null))
                    {
                        if (((this.Id == -1) 
                                    || (this.EntityState.Equals(CodeFluent.Runtime.CodeFluentEntityState.Created) == true)))
                        {
                            this._idioma = new Humanisme.EtapaVitalIdiomaCollection(this);
                            return this._idioma;
                        }
                        this._idioma = Humanisme.EtapaVitalIdiomaCollection.LoadByEtapa(this);
                    }
                    return this._idioma;
                }
            }
    
            [System.Xml.Serialization.XmlIgnoreAttribute()]
            public Humanisme.DocumentCollection Documents
            {
                get
                {
                    if ((this._documents == null))
                    {
                        if (((this.Id == -1) 
                                    || (this.EntityState.Equals(CodeFluent.Runtime.CodeFluentEntityState.Created) == true)))
                        {
                            this._documents = new Humanisme.DocumentCollection(null, this);
                            return this._documents;
                        }
                        this._documents = Humanisme.DocumentCollection.LoadByEtapaVital(this);
                    }
                    return this._documents;
                }
            }
    
    
            public virtual CodeFluent.Runtime.CodeFluentEntityState EntityState
            {
                get
                {
                    return this._entityState;
                }
                set
                {
                    if ((System.Collections.Generic.EqualityComparer<CodeFluent.Runtime.CodeFluentEntityState>.Default.Equals(value, this.EntityState) == true))
                    {
                        return;
                    }
                    if (((this._entityState == CodeFluent.Runtime.CodeFluentEntityState.ToBeDeleted) 
                                && (value == CodeFluent.Runtime.CodeFluentEntityState.Modified)))
                    {
                        return;
                    }
                    if (((this._entityState == CodeFluent.Runtime.CodeFluentEntityState.Created) 
                                && (value == CodeFluent.Runtime.CodeFluentEntityState.Modified)))
                    {
                        return;
                    }
                    this._entityState = value;
                    this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("EntityState"));
                }
            }
    

It seems there are not related property options on the model surface "Properties" window and I'm not able to find the xml tags or attributes in the cfp file.

I will be very grateful if you can give me any clue or reference where to start learning the CodeFluent Model options that lead to these outputs in the classes.

Thanks again, I'm really turning into a CodeFluent enthusiast!

Upvotes: 2

Views: 111

Answers (1)

meziantou
meziantou

Reputation: 21337

The RowVersion property is generated by CodeFluent Entities because you set the concurrency mode to Optimistic (documentation). If you don't have the latest value of this property, you cannot save the entity (CodeFluentConcurrencyException). So this property needs to be serialized.

The EntityDisplayName is for UI purposes. Its value is computed from one or many properties. So there is no need to serialize it as you can compute it client side.

There is currently no attributes to change the serialization behavior for these specific properties. However you can write a custom sub producer to add/remove serialization attributes on properties. You'll find an example that adds Json.NET specific attributes on properties (GitHub)

Here's are some attributes to change the serialization behavior:

  • serializable (Entity): Determines if this entity is marked as serializable
  • serializeEntityKey (Entity): Determines if the EntityKey must be serialized
  • serializeTypeName (Entity): Determines if the TypeName must be serialized
  • serializationMode (Property): documentation
  • dataMember or includeInSerialization (Property) => Prefer using serializationMode
  • serializationOrder (Property): Defines the sort order of this property when serialized
  • serializationNullable (Property): Determines if the property can be skipped when serialized
  • serializePrivateMember (Property): Determines if the private field of a non-serializable property is serializable
  • publicSerializationCallbacks (Project): Determines if the serialization callback methods are public (OnEntityDeserializing, OnEntityDeserialized, etc.)

Upvotes: 1

Related Questions