Как я сериализирую все свойства NHibernate-отображенного объекта?

Вы можете использовать именованный блок вокруг петель:

search: {
    for (Type type : types) {
        for (Type t : types2) {
            if (some condition) {
                // Do something and break...
                break search;
            }
        }
    }
}
7
задан John Saunders 30 July 2009 в 15:11
поделиться

2 ответа

Лучший способ сериализовать отображенный объект NH - не сериализовать его :).

Если вы отправляете его по сети, вам действительно следует создать для него DTO. Если вы не хотите создавать этот объект, вы можете установить [XmlIgnore] для свойств, которые не хотите сериализовать.

Если вам нужны все свойства, вы должны загрузить их ВСЕ из базы данных - для некоторых будет достаточно активной загрузки для других (когда слишком много объединений начнут дублировать данные), вам придется обращаться к этому свойству любым способом. вы хотите вызвать загрузку.

Изменить:

И я хотел бы добавить еще одну вещь - отправка ваших доменных объектов по сети всегда плохая идея. В моем случае я усвоил это на собственном горьком опыте - я открываю некоторые сущности через WebService - и теперь почти любые изменения (переименование свойства, удаление свойства .. и т. д.) в мой домен убивает приложение, использующее WS - плюс у целой группы свойств есть [XmlIgnore] (не забывайте о циклических зависимостях).

Мы скоро переписываем - но будьте уверены, что это не то, что я когда-либо сделаю снова. :)

Edit 2

Вы можете использовать AutoMapper для передачи данных от вашего объекта в DTO. У них есть несколько примеров на сайте.

21
ответ дан 6 December 2019 в 07:07
поделиться

Согласитесь с sirrocco, у меня было ужасное время, пытаясь сериализовать сущности NHibernate через WCF, и в конечном итоге я выбрал решение DTO, реализованное в общем через отражение.

Изменить: все решение слишком велико, чтобы публиковать здесь, и, конечно же, настроено для моих нужд, поэтому я опубликую несколько соответствующих разделов:

[DataContract]
public class DataTransferObject
{
    private Dictionary<string, object> propertyValues = new Dictionary<string, object>();
    private Dictionary<string, object> fieldValues = new Dictionary<string, object>();
    private Dictionary<string, object> relatedEntitiesValues = new Dictionary<string, object>();
    private Dictionary<string, object> primaryKey = new Dictionary<string, object>();
    private Dictionary<string,List<DataTransferObject>> subEntities = new Dictionary<string, List<DataTransferObject>>();

...

    public static DataTransferObject ConvertEntityToDTO(object entity,Type transferType)
    {
        DataTransferObject dto = new DataTransferObject();
        string[] typePieces = transferType.AssemblyQualifiedName.Split(',');

        dto.AssemblyName = typePieces[1];
        dto.TransferType = typePieces[0];

        CollectPrimaryKeyOnDTO(dto, entity);
        CollectPropertiesOnDTO(dto, entity);
        CollectFieldsOnDTO(dto, entity);
        CollectSubEntitiesOnDTO(dto, entity);
        CollectRelatedEntitiesOnDTO(dto, entity);

        return dto;
    }
....

     private static void CollectPropertiesOnDTO(DataTransferObject dto, object entity)
    {
        List<PropertyInfo> transferProperties = ReflectionHelper.GetProperties(entity,typeof(PropertyAttribute));

        CollectPropertiesBasedOnFields(entity, transferProperties);

        foreach (PropertyInfo property in transferProperties)
        {
            object propertyValue = ReflectionHelper.GetPropertyValue(entity, property.Name);

            dto.PropertyValues.Add(property.Name, propertyValue);
        }
    }

тогда, когда вы захотите воскресить DTO:

    private static DTOConversionResults ConvertDTOToEntity(DataTransferObject transferObject,object parent)
    {
        DTOConversionResults conversionResults = new DTOConversionResults();

        object baseEntity = null;
        ObjectHandle entity = Activator.CreateInstance(transferObject.AssemblyName,
                                                       transferObject.TransferType);

        if (entity != null)
        {
            baseEntity = entity.Unwrap();

            conversionResults.Add(UpdatePrimaryKeyValue(transferObject, baseEntity));
            conversionResults.Add(UpdateFieldValues(transferObject, baseEntity));
            conversionResults.Add(UpdatePropertyValues(transferObject, baseEntity));
            conversionResults.Add(UpdateSubEntitiesValues(transferObject, baseEntity));
            conversionResults.Add(UpdateRelatedEntitiesValues(transferObject, baseEntity,parent));
....

    private static DTOConversionResult UpdatePropertyValues(DataTransferObject transferObject, object entity)
    {            
        DTOConversionResult conversionResult = new DTOConversionResult();

        foreach (KeyValuePair<string, object> values in transferObject.PropertyValues)
        {
            try
            {
                ReflectionHelper.SetPropertyValue(entity, values.Key, values.Value);
            }
            catch (Exception ex)
            {
                string failureReason = "Failed to set property " + values.Key + " value " + values.Value;

                conversionResult.Failed = true;
                conversionResult.FailureReason = failureReason;

                Logger.LogError(failureReason);
                Logger.LogError(ExceptionLogger.BuildExceptionLog(ex));
            }
        }

        return conversionResult;
    }
0
ответ дан 6 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: