Skip to content

Commit f03f206

Browse files
committed
Ditching System.Serialization.ObjectIdGenerator
1 parent 4aaae16 commit f03f206

File tree

6 files changed

+52
-11
lines changed

6 files changed

+52
-11
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ DumpConfig.Default.MaxDepth = 3;
210210
* Add custom rendering for more types:
211211
- Exceptions, AggregateExceptions, etc...
212212
* Rethink Generators caching keys
213-
* Ditch `ObjectIdGenerator` and create a custom, modern implementation
214213
* Consider using Max Depth for Descriptors
215214
* Refactor Renderers and make it better extendable
216215
* Add more renderers

src/Dumpify.Playground/Program.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,31 @@
1212
// DumpConfig.Default.TableConfig.ShowMemberTypes = true;
1313
// new DirectoryInfo("C:\\Program Files").Dump();
1414
// (1, 2, 3, 4, ("1", "b"), 5, 6, 7, 8, 9, 10, 11, 12, 13, "14", "15", 16, 17, 18).Dump("ValueTuple", tableConfig: new TableConfig { MaxCollectionCount = 4 });
15-
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, "14", "15", 16, 17, 18).Dump("ValueTuple 1");
16-
(1, 2, 3, 4, ("1", "b"), 5, 6, 7, 8, 9, 10, 11, 12, 13, "14", "15", 16, 17, 18).Dump("ValueTuple");
17-
Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10, 11)).Dump("System.Tuple");
15+
// (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, "14", "15", 16, 17, 18).Dump("ValueTuple 1");
16+
// (1, 2, 3, 4, ("1", "b"), 5, 6, 7, 8, 9, 10, 11, 12, 13, "14", "15", 16, 17, 18).Dump("ValueTuple");
17+
// Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10, 11)).Dump("System.Tuple");
1818
// new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }.Dump(tableConfig: new TableConfig { MaxCollectionCount = 3 });
1919
Console.WriteLine("---------------------");
20+
var moaid1 = new Person
21+
{
22+
FirstName = "Moaid",
23+
LastName = "Hathot",
24+
Profession = Profession.Software
25+
};
26+
27+
var haneeni1 = new Person
28+
{
29+
FirstName = "Haneeni",
30+
LastName = "Shibli",
31+
Profession = Profession.Health
32+
};
2033

34+
moaid1.Spouse = haneeni1;
35+
haneeni1.Spouse = moaid1;
36+
37+
new [] { moaid1, haneeni1 }.Dump();
38+
39+
moaid1.Dump();
2140
// TestSpecific();
2241
// TestSingle();
2342
// ShowEverything();
@@ -35,7 +54,6 @@
3554
//var foo = new { Name = "Moaid", LastName = "Hathot", Age = 35, Content = Enumerable.Range(0, 10).Select(i => (char)(i + 'a')).ToArray() };
3655
//foo.Dump("Test");
3756

38-
3957
void TestSpecific()
4058
{
4159
{
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Dumpify;
2+
3+
public interface IObjectIdTracker
4+
{
5+
public (bool firstTime, long id) Track(object obj);
6+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace Dumpify;
2+
3+
public class ObjectIdReferenceTracker : IObjectIdTracker
4+
{
5+
private readonly Dictionary<object, long> _objects = new(ReferenceEqualityComparer.Instance);
6+
7+
public (bool firstTime, long id) Track(object obj)
8+
{
9+
if(_objects.TryAdd(obj, _objects.Count + 1))
10+
{
11+
return (true, _objects.Count);
12+
}
13+
else
14+
{
15+
return (false, _objects[obj]);
16+
}
17+
}
18+
}

src/Dumpify/Renderers/RenderContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
namespace Dumpify;
44

55
//Todo: RootObjectTransform is a temp workaround and should be removed once we merge the ObjectTableBuilder logic
6-
public record class RenderContext(in RendererConfig Config, ObjectIDGenerator ObjectTracker, int CurrentDepth, object? RootObject, object? RootObjectTransform);
7-
public record class RenderContext<TState>(in RendererConfig Config, ObjectIDGenerator ObjectTracker, int CurrentDepth, object? RootObject, object? RootObjectTransform, TState State) : RenderContext(Config, ObjectTracker, CurrentDepth, RootObject, RootObjectTransform);
6+
public record class RenderContext(in RendererConfig Config, IObjectIdTracker ObjectTracker, int CurrentDepth, object? RootObject, object? RootObjectTransform);
7+
public record class RenderContext<TState>(in RendererConfig Config, IObjectIdTracker ObjectTracker, int CurrentDepth, object? RootObject, object? RootObjectTransform, TState State) : RenderContext(Config, ObjectTracker, CurrentDepth, RootObject, RootObjectTransform);

src/Dumpify/Renderers/RendererBase.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Dumpify.Descriptors;
22
using Dumpify.Descriptors.ValueProviders;
33
using System.Collections.Concurrent;
4-
using System.Runtime.Serialization;
54

65
namespace Dumpify;
76

@@ -26,7 +25,7 @@ protected void AddCustomTypeDescriptor(ICustomTypeRenderer<TRenderable> handler)
2625
public IRenderedObject Render(object? obj, IDescriptor? descriptor, RendererConfig config)
2726
{
2827
var state = CreateState(obj, descriptor, config);
29-
var idGenerator = new ObjectIDGenerator();
28+
var idGenerator = new ObjectIdReferenceTracker();
3029
var context = new RenderContext<TState>(config, idGenerator, 0, obj, null, state);
3130

3231
var renderable = obj switch
@@ -135,9 +134,10 @@ private TRenderable RenderCustomDescriptor(object obj, CustomDescriptor customDe
135134
return RenderDescriptor(customValue, customValueDescriptor, context);
136135
}
137136

138-
private bool ObjectAlreadyRendered(object @object, ObjectIDGenerator tracker)
137+
private bool ObjectAlreadyRendered(object @object, IObjectIdTracker tracker)
139138
{
140-
tracker.GetId(@object, out var firstTime);
139+
// tracker.GetId(@object, out var firstTime);
140+
var (firstTime, id) = tracker.Track(@object);
141141

142142
return firstTime is false;
143143
}

0 commit comments

Comments
 (0)