Skip to content

Commit f32bfb1

Browse files
committed
Add support for serializing and deserializing LINQ expressions, including validation for secure deserialization.
1 parent d8b26e8 commit f32bfb1

5 files changed

Lines changed: 830 additions & 9 deletions

File tree

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
using System;
2+
using System.Linq.Expressions;
3+
using CoreRemoting.Serialization.NeoBinary;
4+
using Xunit;
5+
6+
namespace CoreRemoting.Tests
7+
{
8+
public class NeoBinaryExpressionSerializationTests
9+
{
10+
[Fact]
11+
public void SerializeDeserialize_ConstantExpression()
12+
{
13+
var serializer = new NeoBinarySerializerAdapter(new NeoBinarySerializerConfig { AllowExpressions = true, IncludeAssemblyVersions = true });
14+
15+
var original = Expression.Constant(42);
16+
var serialized = serializer.Serialize(original);
17+
var deserialized = (ConstantExpression)serializer.Deserialize(typeof(ConstantExpression), serialized);
18+
19+
Assert.Equal(original.Value, deserialized.Value);
20+
Assert.Equal(original.Type, deserialized.Type);
21+
}
22+
23+
[Fact]
24+
public void SerializeDeserialize_ParameterExpression()
25+
{
26+
var serializer = new NeoBinarySerializerAdapter(new NeoBinarySerializerConfig { AllowExpressions = true, IncludeAssemblyVersions = true });
27+
28+
var original = Expression.Parameter(typeof(int), "x");
29+
var serialized = serializer.Serialize(original);
30+
var deserialized = (ParameterExpression)serializer.Deserialize(typeof(ParameterExpression), serialized);
31+
32+
Assert.Equal(original.Name, deserialized.Name);
33+
Assert.Equal(original.Type, deserialized.Type);
34+
}
35+
36+
[Fact]
37+
public void SerializeDeserialize_BinaryExpression()
38+
{
39+
var serializer = new NeoBinarySerializerAdapter(new NeoBinarySerializerConfig { AllowExpressions = true, IncludeAssemblyVersions = true });
40+
41+
var left = Expression.Constant(10);
42+
var right = Expression.Constant(20);
43+
var original = Expression.Add(left, right);
44+
45+
var serialized = serializer.Serialize(original);
46+
var deserialized = (BinaryExpression)serializer.Deserialize(typeof(BinaryExpression), serialized);
47+
48+
Assert.Equal(original.NodeType, deserialized.NodeType);
49+
Assert.Equal(((ConstantExpression)original.Left).Value, ((ConstantExpression)deserialized.Left).Value);
50+
Assert.Equal(((ConstantExpression)original.Right).Value, ((ConstantExpression)deserialized.Right).Value);
51+
}
52+
53+
[Fact]
54+
public void SerializeDeserialize_LambdaExpression()
55+
{
56+
var serializer = new NeoBinarySerializerAdapter(new NeoBinarySerializerConfig { AllowExpressions = true, IncludeAssemblyVersions = true });
57+
58+
var param = Expression.Parameter(typeof(int), "x");
59+
var body = Expression.Add(param, Expression.Constant(1));
60+
var original = Expression.Lambda<Func<int, int>>(body, param);
61+
62+
var serialized = serializer.Serialize(original);
63+
var deserialized = (Expression<Func<int, int>>)serializer.Deserialize(typeof(Expression<Func<int, int>>), serialized);
64+
65+
var compiled = deserialized.Compile();
66+
Assert.Equal(43, compiled(42));
67+
}
68+
69+
[Fact]
70+
public void SerializeDeserialize_FilterExpression()
71+
{
72+
var serializer = new NeoBinarySerializerAdapter(new NeoBinarySerializerConfig { AllowExpressions = true, IncludeAssemblyVersions = true });
73+
74+
var param = Expression.Parameter(typeof(TestClass), "item");
75+
var property = Expression.Property(param, nameof(TestClass.Value));
76+
var constant = Expression.Constant(5);
77+
var body = Expression.GreaterThan(property, constant);
78+
var original = Expression.Lambda<Func<TestClass, bool>>(body, param);
79+
80+
var serialized = serializer.Serialize(original);
81+
var deserialized = (Expression<Func<TestClass, bool>>)serializer.Deserialize(typeof(Expression<Func<TestClass, bool>>), serialized);
82+
83+
var compiled = deserialized.Compile();
84+
Assert.True(compiled(new TestClass { Value = 10 }));
85+
Assert.False(compiled(new TestClass { Value = 3 }));
86+
}
87+
88+
89+
90+
public class TestClass
91+
{
92+
public int Value { get; set; }
93+
}
94+
}
95+
}

0 commit comments

Comments
 (0)