Originally posted by **Marvin-Brouwer** February 9, 2022
We'd like to research the possibility of generating the JSON/XML/whatever mappings on build instead of reflecting this on startup.
For example, change this:
```CS
public sealed class ProjectProfile : OpenAirSerializerProfile
{
public override void Configure()
{
For(
attributeNamingStrategy: Names.Use.SnakeCase,
tagNamingStrategy: Names.Use.PascalCase
)
.Child(project => project.Name)
.Child(project => project.LastUpdate,
namingStrategy: Names.Equal("updated"),
converter: Converters.Use.OpenAirDate)
.Child(project => project.Active,
converter: Converters.Use.StringBitBoolean)
.Child(project => project.CustomDate,
namingStrategy: Names.Use.CustomFieldNames,
converter: Converters.Use.SimpleDate)
.Child(project => project.RateCardId);
}
}
```
Into this:
```CS
public sealed class GeneratedSerializer {
public string? Serialize(object? objectToSerialize) {
if(object is null) return null)
if(objectToSerialize is FullNamespace.Project)) return ProjectSerializer.Serialize(objectToSerialize);
// ...
throw new ClassMapNotFoundException(objectToSerialize.GetType());
}
}
```
```CS
public static class ProjectSerializer {
public static string? Serialize(Project objectToSerialize, ISerializerContext context) {
const projectName = Names.Use.PascalCase(objectToSerialize.GetType(), context);
var dataConatiner = new XObject(projectName,
new XmlBuilder.Element(
Names.Use.SnakeCase(objectToSerialize.GetType().GetProperty(nameof(objectToSerialize.Name)), context),
Converters.Use.Convertible(objectToSerialize.Name, context)),
new XmlBuilder.Element(
Names.Equal("updated")(nameof(objectToSerialize.LastUpdate), context),
Converters.Use.OpenAirDate(objectToSerialize.LastUpdate)),
new XmlBuilder.Element(
Names.Use.SnakeCase(objectToSerialize.GetType().GetProperty(nameof(objectToSerialize.Active)), context),
Converters.Use.StringBitBoolean(objectToSerialize.Active, context)),
new XmlBuilder.Element(
Names.Use.CustomFieldNames(objectToSerialize.GetType().GetProperty(nameof(objectToSerialize.CustomDate)), context),
Converters.Use.SimpleDate(objectToSerialize.CustomDate, context)),
new XmlBuilder.Element(
Names.Use.SnakeCase(objectToSerialize.GetType().GetProperty(nameof(objectToSerialize.RateCardId)), context),
Converters.Use.Convertible(objectToSerialize.RateCardId.ToString(), context))
);
return dataContainer.ToString();
}
}
```
Or something similar to that.
The question is, do we even want this?
Do we want to support this as an option or is it always on?
---
Additional notes:
---
These might be interesting libraries:
- https://andrewlock.net/netescapades-enumgenerators-a-source-generator-for-enum-performance/
Discussed in https://github.com/Marvin-Brouwer/FluentSerializer/discussions/69