2016-08-18 3 views
-1

Возможно, кто-то знает решение. Я не могу десериализовать выражение.C# Json Deserialization выражение

стороне клиента:

var expresion= (Expression<Func<Company, bool>>)(model => model.Id ==id); 
var respond = new JObject(); 
respond .Add("Expression", JToken.FromObject(expresion)); 

стороне сервера:

JsonSerializer serializer = new JsonSerializer(); 
serializer.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor; 
T p = (T)serializer.Deserialize(new JTokenReader(jObject), typeof(T)); 

Исключение:

{"Unable to find a constructor to use for type System.Linq.Expressions.Expression`1[System.Func`2[HostStorageModels.Company,System.Boolean]]. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'Expression.Type'."} 
+2

Это говорит вам, что это не так, верно? –

ответ

0

https://github.com/6bee/Remote.Linq

var query = (Expression<Func<Person, bool>>)(model => model.FirstName == "test2"); 
var remoteExpression = query.ToRemoteLinqExpression(); 

var request = new Request<Person> 
{ 
     Items = new List<Person>() 
     { 
      new Person() { FirstName = "test", Id = 1 }, 
      new Person() { FirstName = "test2", Id = 2 } 
     }, 
     Expression = remoteExpression 
}; 
var serializerSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; 
string jsonString = JsonConvert.SerializeObject(request, serializerSettings); 
var result = JsonConvert.DeserializeObject<Request<Person>>(jsonString, serializerSettings); 
var expresion = result.Expression.ToLinqExpression<Person, bool>(); 
var filtered = request.Items.Where(expresion.Compile()).ToList(); 
1

Я думаю, что он явно говорит вам, что нет конструктора для создания выражения. Если вы проверите Expression Constructor() в документации MSDN, вы увидите, что он защищен. Вы можете попытаться отправить выражение в другом сериализованном формате и восстановить его, когда получите его с другой стороны.

+0

может быть, кто-то знает, что перестроить? –