{"id":23303959,"url":"https://github.com/tacosontitan/pasper","last_synced_at":"2026-02-22T12:10:38.969Z","repository":{"id":156778442,"uuid":"626147596","full_name":"tacosontitan/Pasper","owner":"tacosontitan","description":"A lightweight, provider agnostic, serialization proxy designed to simplify serialization definitions.","archived":false,"fork":false,"pushed_at":"2024-11-26T03:26:44.000Z","size":123,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-26T04:24:58.160Z","etag":null,"topics":["agnostic","binary","dotnet","json","provider","proxy","serialization","toml","xml","yaml"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tacosontitan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["tacosontitan"]}},"created_at":"2023-04-10T22:35:00.000Z","updated_at":"2024-11-26T03:26:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"6aa8a4b3-d479-409f-8f05-8630107d0d0e","html_url":"https://github.com/tacosontitan/Pasper","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tacosontitan%2FPasper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tacosontitan%2FPasper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tacosontitan%2FPasper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tacosontitan%2FPasper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tacosontitan","download_url":"https://codeload.github.com/tacosontitan/Pasper/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230575793,"owners_count":18247484,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["agnostic","binary","dotnet","json","provider","proxy","serialization","toml","xml","yaml"],"created_at":"2024-12-20T11:14:26.682Z","updated_at":"2026-02-22T12:10:38.908Z","avatar_url":"https://github.com/tacosontitan.png","language":"C#","funding_links":["https://github.com/sponsors/tacosontitan"],"categories":[],"sub_categories":[],"readme":"# 🎨 Pasper\n\nPasper is a proxy for serialization services that allows consumers to simplify their attribute requirements by using a single attribute to describe how a type should be serialized, or ignored.\n\n![License](https://img.shields.io/github/license/tacosontitan/Pasper?logo=github\u0026style=for-the-badge)\n\nThe name is a combination of the acronym PASP (Provider Agnostic Serialization Proxy) and provider to create a unique name that is easy to remember.\n\n## 💁‍♀️ Getting Started\n\nGet started by reviewing the answers to the following questions:\n\n- [How do I navigate the codebase with confidence?](http://pasper.tacosontitan.com)\n- [How can I help?](./CONTRIBUTING.md)\n- [How should I behave here?](./CODE_OF_CONDUCT.md)\n- [How do I report security concerns?](./SECURITY.md)\n- [What third-party dependencies are used?](./NOTICES.md)\n\n### ✅ Small changes, continuously integrated\n\nPasper employs workflows for continuous integration to ensure the repository is held to industry standards; here's the current state of those workflows:\n\n![.NET Workflow](https://img.shields.io/github/actions/workflow/status/tacosontitan/Pasper/dotnet.yml?label=Build%20and%20Test\u0026logo=dotnet\u0026style=for-the-badge)\n\n### 💎 A few more gems\n\nWe believe in keeping the community informed, so here's a few more tidbits of information to satisfy some additional curiosities:\n\n![Contributors](https://img.shields.io/github/contributors/tacosontitan/Pasper?logo=github\u0026style=for-the-badge)\n![Issues](https://img.shields.io/github/issues/tacosontitan/Pasper?logo=github\u0026style=for-the-badge)\n![Stars](https://img.shields.io/github/stars/tacosontitan/Pasper?logo=github\u0026style=for-the-badge)\n![Size](https://img.shields.io/github/languages/code-size/tacosontitan/Pasper?logo=github\u0026style=for-the-badge)\n![Line Count](https://img.shields.io/tokei/lines/github/tacosontitan/Pasper?logo=github\u0026style=for-the-badge)\n\n## 🛣️ Roadmap\n\nThe following is a list of features that are planned for the future:\n\n- [x] Create a common attribute for ignoring members.\n- [x] Create a common attribute for serializing members.\n- [ ] Create a way to transform member names based on the format.\n- [ ] Add support for XML.\n  - [ ] Add support for XML elements.\n  - [ ] Add support for XML attributes.\n  - [ ] Add support for XML arrays.\n- [ ] Add support for JSON.\n- [ ] Add support for YAML.\n- [ ] Add support for TOML.\n\nEach format Pasper provides support for will be contained in its own assembly to allow consumers to only include the formats they need. The naming convention for these assemblies will be `Pasper.{Format}`, for example:\n\n- `Pasper.Json`\n- `Pasper.Yaml`\n\nThis will allow consumers to easily identify the format they're after, and only include the assemblies they need.\n\n### 🆘 What problem does Pasper aim to solve\n\nMost serialization providers define their own attributes for defining how members should be serialized or ignored. This can lead to a lot of clutter in your codebase, especially if you're using multiple providers:\n\n```csharp\n[XmlElement(\"Id\")]\n[JsonProperty(\"id\")]\n[YamlMember(Alias = \"id\")]\npublic int Id { get; set; }\n```\n\nEach provider does it a little bit differently, and each provider has its own set of attributes. This can lead to a lot of code duplication, and a lot of confusion when you're trying to figure out how to serialize a type. The idea behind Pasper is to simplify this:\n\n```csharp\n[SerializedMember(nameof(Id))]\npublic int Id { get; set; }\n```\n\nThis is a lot cleaner, and a lot easier to understand. It also allows you to easily switch providers without having to change your codebase. This is especially useful if you're using multiple providers, and you want to switch from one to another.\n\n### 🏆 What is the biggest obstacle currently\n\nXML supports many different attributes such as `XmlElement` and `XmlAttribute`. This will need to be taken into consideration while designing the common interface as most other formats aren't as flexible. This is likely to be the most challenging aspect of this project, and will require a lot of thought and consideration.\n\n### 🤔 Something else to think about\n\nCurrently, consumers have complete control over how their types are serialized with each specific provider. This means that Pasper will have to provide a way to support this level of control, while still providing a simplified way to serialize types. One way we might approach this is by preferring the provider defined attribute over the Pasper defined attribute. This would allow consumers to use the provider defined attribute to override the Pasper defined attribute, while still providing a simplified way to serialize types. This is likely the most concise way to provide this level of control, but it's not likely to be the only way, so we're open for ideas.\n\nImagine the following scenario:\n\n```csharp\n[XmlElement(\"ID\")]\n[SerializedMember(\"id\")]\npublic int Id { get; set; }\n```\n\nIn this use-case, the consumer is using the `XmlElement` attribute to define how the `Id` property should be serialized. Pasper should respect this, and use the `XmlElement` attribute to serialize the property, rather than the `SerializedMember` attribute. However, for all other providers, Pasper should use the `SerializedMember` attribute to serialize the property.\n\n#### 🔤 How should we handle casing\n\nIdeally, we just take the input and use that as the desired output, regardless of format. However, we should consider transformation of the output based on the format. This can easily be achieved by using an interface, `Func\u003cstring, string\u003e` or many other methods that provide the consumer with the ability to transform the output.\n\n### ✨ Potential Features\n\nThe following is a list of features that are being considered for the future:\n\n- [ ] Add support for INI.\n- [ ] Add support for HOCON.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftacosontitan%2Fpasper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftacosontitan%2Fpasper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftacosontitan%2Fpasper/lists"}