{"id":36924203,"url":"https://github.com/maurosampietro/UltraMapper","last_synced_at":"2026-01-28T10:00:56.698Z","repository":{"id":37458163,"uuid":"87171727","full_name":"maurosampietro/UltraMapper","owner":"maurosampietro","description":"A fast and lightweight object-to-object .NET mapper.","archived":false,"fork":false,"pushed_at":"2025-01-29T19:21:15.000Z","size":1100,"stargazers_count":36,"open_issues_count":4,"forks_count":6,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-01-29T20:29:14.851Z","etag":null,"topics":["complex-objects","deep-copy","map","mapper","object-to-object"],"latest_commit_sha":null,"homepage":"https://maurosampietro.github.io/UltraMapper/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maurosampietro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-04-04T10:00:43.000Z","updated_at":"2025-01-01T02:35:38.000Z","dependencies_parsed_at":"2023-01-19T12:30:23.344Z","dependency_job_id":"d9c3cfce-3a74-40d8-8547-d30d4bc77727","html_url":"https://github.com/maurosampietro/UltraMapper","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/maurosampietro/UltraMapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maurosampietro%2FUltraMapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maurosampietro%2FUltraMapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maurosampietro%2FUltraMapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maurosampietro%2FUltraMapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maurosampietro","download_url":"https://codeload.github.com/maurosampietro/UltraMapper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maurosampietro%2FUltraMapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28844011,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T07:39:25.367Z","status":"ssl_error","status_checked_at":"2026-01-28T07:39:24.487Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["complex-objects","deep-copy","map","mapper","object-to-object"],"created_at":"2026-01-12T19:00:25.488Z","updated_at":"2026-01-28T10:00:56.686Z","avatar_url":"https://github.com/maurosampietro.png","language":"C#","readme":"## 🚀 Project Status \u0026 Call for Feedback\n\n**UltraMapper introduces a general-purpose mapping engine that goes beyond traditional serializers.**    \nMajor improvements in performance, code quality, and scenario handling were developed in 2022 to support the creation of a more general-purpose mapping engine and framework. This framework is designed to allow developers to map anything to anything by creating plugins or bindings.\n\nSerializers in particular (such as JSON, XML, or, more generally, any text-to-object solution) can be seen as being composed of two parts: a parser and a mapper.   \nWith these changes to the UltraMapper core engine, it will be possible to implement only the parser step (by implementing a specific interface) and fully delegate the mapping step to UltraMapper. Despite being a highly general solution with a strong focus on configurability, it still delivers good performance.\n\nSeveral implementations already exist as proof of concept, including UltraMapper.Xml, UltraMapper.Json, and UltraMapper.CSV (advanced implementation) and i'd love developers to support new formats.\n\n**UltraMapper has been developed primarily by a single full-time engineer.** While the core architecture is solid and production-ready in many areas, finalization and ecosystem growth require additional time and resources.\n\nSince AutoMapper has transitioned to a commercial model, **there is an opportunity for UltraMapper to evolve into a sustainable open-source or commercially supported alternative.**\n🤝 I am actively seeking feedback, strategic interest, or support to determine the best path forward—whether through collaboration or sponsorship.\n\n👉 If you find this approach valuable, please:\n- ⭐ Star the project\n- 💬 Share feedback or ideas\n- 🤝 Reach out if you’d like to contribute or sponsor development\n\n\n[Please take a minute to support this project with a small donation!](https://www.paypal.com/donate/?hosted_button_id=MC59U7TDE3KCQ)     \n[![Paypal](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.paypal.com/donate/?hosted_button_id=MC59U7TDE3KCQ)\n\n\n# UltraMapper\n[![Build status](https://ci.appveyor.com/api/projects/status/github/maurosampietro/UltraMapper?svg=true)](https://ci.appveyor.com/project/maurosampietro/ultramapper/branch/master)\n[![NuGet](http://img.shields.io/nuget/v/UltraMapper.svg)](https://www.nuget.org/packages/UltraMapper/)\n\n\nA nicely coded object-mapper for .NET \n\n\n\nWhat is UltraMapper?\n--------------------------------\n\nUltraMapper is a .NET mapper, that is, a tool that avoids you the need to write the code needed to copy values from a source object to a target object. It avoids you the need to manually write the (boring and hard-to-maintain) code that reads the value from the source and instantiate/assign the relative member on the target object.\n\nIt can be used to get deep copies of an object or map an object to another type.\n\nConsider this simple class:\n\n````c#\npublic class Person\n{\n    public DateTime Birthday { get; set; }\n    public string FirstName { get; set; }\n    public string LastName { get; set; }\n    public string EmailAddress { get; set; }\n}\n````\n\nIf you wanted a copy of an instance of the above class your should write something like this:\n\n````c#\nvar clone = new Person();\nclone.Birthday = person.Birthday\nclone.FirstName = person.FirstName\nclone.LastName = person.LastName\nclone.EmailAddress = person.EmailAddress\n````\n\nWhat if you had hundreds of simple objects like the one above to copy? What if the object was more complex, contained references to other complex objects or collections of other complex objects? \n\nWould you still map it manually!?\nWith UltraMapper you can solve this problem efficiently like this:\n\n````c#\nMapper ultraMapper = new Mapper();\nPerson clone = ultraMapper.Map\u003cPerson\u003e( person );\n````\n\nGetting started\n--------------------------------\n\nCheck out the [wiki](https://github.com/maurosampietro/UltraMapper/wiki/Getting-started) for more information and advanced scenarios\n\nWhy should I use UltraMapper instead of well-known alternatives?\n--------------------------------\n\nThe answer is ReferenceTracking, Reliability, Performance and Maintainability.\n\nThe ReferenceTracking mechanism of UltraMapper guarantees that the cloned or mapped object **preserve the same reference structure of the source object**: if an instance is referenced twice in the source object, we will create only one new instance for the target, and assign it twice.\n\nThis is something theorically simple but crucial, yet **uncommon among mappers**; in facts other mappers tipically will create new instances on the target even if the same instance is being referenced twice in the source.\n\nWith UltraMapper, any reference object is cached and before creating any new reference a cache lookup is performed to check if that instance has already been mapped. If the reference has already been mapped, the mapped instance is used.   \n\nThis technique allows self-references anywhere down the hierarchical tree of the objects involved in the mapping process, avoids StackOverflows and **guarantees that the target object is actually a deep copy or a mapped version of the source and not just a similar object with identical values.**\n\nReferenceTracking mechanism is so important that cannot be disabled and offers a huge performance boost in real-world scenarios. \n\nUltraMapper is just ~1100 lines of code and generates and compiles minimal mapping expressions.\nMappingExpressionBuilders are very well structured in a simple object-oriented way.\n\n\nKey features\n--------------------------------\n\nImplemented features:\n\n- Powerful reference tracking mechanism\n- Powerful type-to-type, type-to-member and member-to-member configuration override mechanism, with configuration inheritance\n- Supports self-references and circular references, anywhere down the object hierarchy\n- Supports object inheritance\n- Supports abstract classes\n- Supports interfaces \n- Supports mapping by convention\n- Supports flattening/projections by convention\n- Supports manual flattening/unflattening/projections.\n- Supports arrays\n- Supports collections (Dictionary, HashSet, List, LinkedList, ObservableCollection, SortedSet, Stack, Queue)\n- Supports collection merging/updating\n\nMoreover UltraMapper is:\n- very fast in any scenario (faster than any other .NET mapper i tried). See the [benchmarks](https://github.com/maurosampietro/UltraMapper/wiki/Benchmarks).\n- developer-friendly (should be easy to contribute, extend and maintain)\n\n**ANY FEEDBACK IS WELCOME**\n\n","funding_links":["https://www.paypal.com/donate/?hosted_button_id=MC59U7TDE3KCQ"],"categories":["C# #"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaurosampietro%2FUltraMapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaurosampietro%2FUltraMapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaurosampietro%2FUltraMapper/lists"}