Skip to content

Commit 5fd2d25

Browse files
committed
add SerializeLayout and MemoryPackOrderAttribute
1 parent dd4ea81 commit 5fd2d25

File tree

4 files changed

+58
-12
lines changed

4 files changed

+58
-12
lines changed

sandbox/SandboxConsoleApp/ForReadMe.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,24 @@ public partial class Version2
138138
public long Prop2 { get; set; }
139139
public int? AddedProp { get; set; }
140140
}
141+
142+
143+
144+
[MemoryPackable(GenerateType.Object)]
145+
public partial class Sonota1
146+
{
147+
148+
}
149+
150+
[MemoryPackable(SerializeLayout.Sequential)]
151+
public partial class Sonota2
152+
{
153+
154+
}
155+
156+
[MemoryPackable(GenerateType.Object, SerializeLayout.Explicit)]
157+
public partial class Sonota3
158+
{
159+
[MemoryPackOrder(0)]
160+
public int MyProperty { get; set; }
161+
}

src/MemoryPack.Core/Attributes.cs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
1-
namespace MemoryPack;
1+
using System.Runtime.InteropServices;
2+
3+
namespace MemoryPack;
24

35
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false, Inherited = false)]
46
public sealed class MemoryPackableAttribute : Attribute
57
{
68
public GenerateType GenerateType { get; }
9+
public SerializeLayout SerializeLayout { get; }
710

8-
public MemoryPackableAttribute(GenerateType generateType = GenerateType.Object)
11+
public MemoryPackableAttribute(GenerateType generateType = GenerateType.Object, SerializeLayout serializeLayout = SerializeLayout.Sequential)
912
{
1013
this.GenerateType = generateType;
14+
this.SerializeLayout = serializeLayout;
15+
}
16+
17+
public MemoryPackableAttribute(SerializeLayout serializeLayout)
18+
{
19+
this.GenerateType = GenerateType.Object;
20+
this.SerializeLayout = serializeLayout;
1121
}
1222
}
1323

@@ -18,11 +28,17 @@ public enum GenerateType
1828
NoGenerate
1929
}
2030

31+
public enum SerializeLayout
32+
{
33+
Sequential, // default
34+
Explicit
35+
}
36+
2137
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = true, Inherited = false)]
2238
public sealed class MemoryPackUnionAttribute : Attribute
2339
{
24-
public byte Tag { get; set; }
25-
public Type Type { get; set; }
40+
public byte Tag { get; }
41+
public Type Type { get; }
2642

2743
public MemoryPackUnionAttribute(byte tag, Type type)
2844
{
@@ -31,17 +47,22 @@ public MemoryPackUnionAttribute(byte tag, Type type)
3147
}
3248
}
3349

34-
// initial design, does not provide this.
35-
//[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
36-
//public sealed class MemoryPackGenerateAttribute : Attribute
37-
//{
38-
//}
39-
4050
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
4151
public sealed class MemoryPackAllowSerializeAttribute : Attribute
4252
{
4353
}
4454

55+
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
56+
public sealed class MemoryPackOrderAttribute : Attribute
57+
{
58+
public int Order { get; }
59+
60+
public MemoryPackOrderAttribute(int order)
61+
{
62+
this.Order = order;
63+
}
64+
}
65+
4566
// similar naming as System.Text.Json attribtues
4667
// https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonattribute
4768

src/MemoryPack.Generator/MemoryPackGenerator.Parser.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ public TypeMeta(INamedTypeSymbol symbol, ReferenceSymbols reference)
6666
}
6767
else if (packableCtorArgs.Value.Length != 0)
6868
{
69+
// TODO: MemoryPackable has two attribtue
70+
// (SerializeLayout serializeLayout)
71+
// (GenerateType generateType = GenerateType.Object, SerializeLayout serializeLayout = SerializeLayout.Sequential)
72+
// so check length first and choose which constructor used.
6973
var ctorValue = packableCtorArgs.Value[0];
7074
var generateType = ctorValue.Value ?? GenerateType.Object;
7175
this.GenerateType = (GenerateType)generateType;

src/MemoryPack.Generator/ReferenceSymbols.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ public class ReferenceSymbols
1010
public INamedTypeSymbol MemoryPackableAttribute { get; }
1111
public INamedTypeSymbol MemoryPackUnionAttribute { get; }
1212
public INamedTypeSymbol MemoryPackConstructorAttribute { get; }
13-
// public INamedTypeSymbol MemoryPackGenerateAttribute { get; }
1413
public INamedTypeSymbol MemoryPackAllowSerializeAttribute { get; }
14+
public INamedTypeSymbol MemoryPackOrderAttribute { get; }
1515
public INamedTypeSymbol MemoryPackIgnoreAttribute { get; }
1616
public INamedTypeSymbol MemoryPackIncludeAttribute { get; }
1717
public INamedTypeSymbol MemoryPackOnSerializingAttribute { get; }
@@ -30,8 +30,8 @@ public ReferenceSymbols(Compilation compilation)
3030
MemoryPackableAttribute = GetTypeByMetadataName(MemoryPackGenerator.MemoryPackableAttributeFullName);
3131
MemoryPackUnionAttribute = GetTypeByMetadataName("MemoryPack.MemoryPackUnionAttribute");
3232
MemoryPackConstructorAttribute = GetTypeByMetadataName("MemoryPack.MemoryPackConstructorAttribute");
33-
//MemoryPackGenerateAttribute = GetTypeByMetadataName("MemoryPack.MemoryPackGenerateAttribute");
3433
MemoryPackAllowSerializeAttribute = GetTypeByMetadataName("MemoryPack.MemoryPackAllowSerializeAttribute");
34+
MemoryPackOrderAttribute = GetTypeByMetadataName("MemoryPack.MemoryPackOrderAttribute");
3535
MemoryPackIgnoreAttribute = GetTypeByMetadataName("MemoryPack.MemoryPackIgnoreAttribute");
3636
MemoryPackIncludeAttribute = GetTypeByMetadataName("MemoryPack.MemoryPackIncludeAttribute");
3737
MemoryPackOnSerializingAttribute = GetTypeByMetadataName("MemoryPack.MemoryPackOnSerializing");

0 commit comments

Comments
 (0)