BreezeSharp - сбой сериализации Enum

Этот вопрос является продолжением BreezeSharp - ExecuteQuery не выполняется с NullReferenceExeption

В моем объекте на стороне сервера у меня есть свойство enum:

[Required]
public DataStore DataStore { get; set; }

Это свойство в объекте на стороне клиента определяется следующим образом:

    public DataStore DataStore
    {
        get { return GetValue<DataStore>(); }
        set { SetValue(value); 
    }

Когда метод контроллера возвращает данные клиенту, возникает ошибка сериализации: «Входная строка имеет неверный формат.»

Вот StackTrace:

at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
   at System.Convert.ToInt32(Object value, IFormatProvider provider)
   at Newtonsoft.Json.Linq.JToken.op_Explicit(JToken value)
   at Newtonsoft.Json.Linq.JToken.ToObject(Type objectType)
   at Breeze.Sharp.JsonEntityConverter.<>c__DisplayClassa.<ParseObject>b__6(KeyValuePair`2 kvp) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 195
   at Breeze.Sharp.Core.EnumerableFns.ForEach[T](IEnumerable`1 items, Action`1 action) in c:\GitHub\breeze.sharp\Breeze.Sharp\Core\EnumerableFns.cs:line 35
   at Breeze.Sharp.JsonEntityConverter.ParseObject(NodeContext nodeContext, EntityAspect targetAspect) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 180
   at Breeze.Sharp.JsonEntityConverter.PopulateEntity(NodeContext nodeContext, IEntity entity) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 152
   at Breeze.Sharp.JsonEntityConverter.CreateAndPopulate(NodeContext nodeContext) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 143
   at Breeze.Sharp.JsonEntityConverter.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 82
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)

Когда я исключаю свойство DataStore из модели, все работает нормально. Похоже, что BreezeSharp пытается разобрать enum как int.

Я попытался определить свойство на стороне клиента как строку, но это приводит к несоответствию метаданных InconsistentCLRPPropertyDefinition. Я также попытался определить свойство на стороне клиента следующим образом:

общественное хранилище данных DataStore { get { var dataStore = this.GetValue ("DataStore"); вернуть DataStore.DEV; } установить { this.SetValue (значение); } } Но проблема возникает до того, как будет нажата команда get.

Я просмотрел JsonEntityConverter.cs, и похоже, что это перечисление не обрабатывается отдельно на данный момент:

private void ParseObject(NodeContext nodeContext, EntityAspect targetAspect) {
      // backingStore will be null if not allowed to overwrite the entity.
      var backingStore = (targetAspect == null) ? null : targetAspect.BackingStore;
      var dict = (IDictionary<String, JToken>) nodeContext.Node;
      var structuralType = nodeContext.StructuralType;
      // needs to be the current namingConvention
      var nc = _mappingContext.EntityManager.MetadataStore.NamingConvention;
      dict.ForEach(kvp => {
        var key = nc.ServerPropertyNameToClient(kvp.Key, structuralType);
        var prop = structuralType.GetProperty(key);
        if (prop != null) {         
          if (prop.IsDataProperty) {
            if (backingStore != null) {
              var dp = (DataProperty)prop;
              if (dp.IsComplexProperty) {
                var newCo = (IComplexObject) kvp.Value.ToObject(dp.ClrType);
                var co = (IComplexObject)backingStore[key];
                var coBacking = co.ComplexAspect.BackingStore;
                newCo.ComplexAspect.BackingStore.ForEach(kvp2 => {
                  coBacking[kvp2.Key] = kvp2.Value;
                });
              } else {
                backingStore[key] = kvp.Value.ToObject(dp.ClrType);
              }

Кто-нибудь знает, куда двигаться дальше?


person markolazic88    schedule 16.05.2014    source источник


Ответы (1)


Это было исправлено в Breeze 0.5.5, доступной уже сейчас.

person Jay Traband    schedule 04.06.2014
comment
Я подтверждаю, что перечисления теперь поддерживаются, и проблема больше не существует. Спасибо Джей! - person markolazic88; 04.06.2014