Giter Site home page Giter Site logo

microsoft / angara.serialization Goto Github PK

View Code? Open in Web Editor NEW
14.0 15.0 12.0 96 KB

An extendible library for serialization of an arbitrary objects to JSON format extended with type information to facilitate interoperability between .NET and JavaScript platforms.

Home Page: http://predictionmachines.github.io/Angara.Serialization/

License: Other

F# 70.02% JavaScript 3.67% TypeScript 26.31%

angara.serialization's Introduction

Angara.Serialization

A library that facilitates serialization on both .NET and JavaScript platforms and communication between them.
The library contains built-in serializers for a wide range of types and can easily be extended with serializers for user-defined types. Serialization formats are pluggable. The shipped implementation is based on JSON.

angara.serialization's People

Contributors

microsoft-github-policy-service[bot] avatar msftgits avatar sergey-berezin avatar vassilyl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

angara.serialization's Issues

InfoSet.Unmarshal works incorrectly when reading an array containing a record

When unmarshalling the given below json, I get incorrect result in 2nd element of the array contained in the field "Array" of the top record:

"Array:object array": [
      null,
      3.1415926535897931,
      {
        ":record": {
          "Age:int": 25,
          "Dogs": [
            "Alba",
            "Eva"
          ],
          "Name": "Adam"
        }
      }]

Instead of a record with fields "Age", "Dogs", "Name", I get an object which has a property with empty name which has the proper record.

Original json:

{
  ":record": {
    "Array:object array": [
      null,
      3.1415926535897931,
      {
        ":record": {
          "Age:int": 25,
          "Dogs": [
            "Alba",
            "Eva"
          ],
          "Name": "Adam"
        }
      },
      {
        ":int array": "AQAAAAIAAAADAAAA"
      }
    ],
    "Boolean": true,
    "Chart:Chart": [
      {
        "displayName": "line",
        "kind": "line",
        "properties": {
          "fill_68": "#1F497D",
          "fill_95": "#1F497D",
          "stroke": "orange",
          "thickness": 2.0,
          "treatAs": "0",
          "x:double array": "AAAAAAAAAAAAAAAAAADwPwAAAAAAAABAAAAAAAAACEAAAAAAAAAQQAAAAAAAABRAAAAAAAAAGEAAAAAAAAAcQAAAAAAAACBAAAAAAAAAIkAAAAAAAAAkQAAAAAAAACZAAAAAAAAAKEAAAAAAAAAqQAAAAAAAACxAAAAAAAAALkAAAAAAAAAwQAAAAAAAADFAAAAAAAAAMkAAAAAAAAAzQAAAAAAAADRAAAAAAAAANUAAAAAAAAA2QAAAAAAAADdAAAAAAAAAOEAAAAAAAAA5QAAAAAAAADpAAAAAAAAAO0AAAAAAAAA8QAAAAAAAAD1AAAAAAAAAPkAAAAAAAAA/QAAAAAAAAEBAAAAAAACAQEAAAAAAAABBQAAAAAAAgEFAAAAAAAAAQkAAAAAAAIBCQAAAAAAAAENAAAAAAACAQ0AAAAAAAABEQAAAAAAAgERAAAAAAAAARUAAAAAAAIBFQAAAAAAAAEZAAAAAAACARkAAAAAAAABHQAAAAAAAgEdAAAAAAAAASEAAAAAAAIBIQAAAAAAAAElA",
          "y:double array": "AAAAAAAAAAAe3YkrC9+RPyfc98lY3qE/DcnvSMfLqj8oUWptj9uxPwKBwrjWT7Y/a1c8m2DCuj/TYk9M1DK/PxmejZZs0ME/dVOoZwsGxD+Jcwt+GjrGP09idt1tbMg/9VhCrNmcyj90xs02MsvMPx255PJL984/kAaTwX2Q0D8pjjLdCqTRP8fVg883ttI/T+kvN+/G0z/czQDQG9bUP/ULinSo49U/PNPOH4Dv1j+BluXujfnXP6r/mCK9Adk/0BoGIfkH2j9TmDd3LQzbP8gFvtpFDtw/AN5EKy4O3T95UCR00gveP+2g7+0eB98/////////3z8T3/0gMXvgPyrdrD4Z9eA/HHdw165t4T8S/RGE6OThP3hJfPi8WuI/Xlp1BCPP4j+2vlWUEULjPznJvbF/s+M/vnpIhGQj5D8cFjxSt5HkP9RPOIFv/uQ/2AviloRp5T8rnIw57tLlPxBz4DCkOuY/zDt/Zp6g5j84TaXm1ATnP4JpyOA/Z+c/wb4zqNfH5z82HKG0lCboPzlQz6Jvg+g/"
        }
      },
      {
        "displayName": "markers",
        "kind": "markers",
        "properties": {
          "borderColor": "black",
          "color": "blue",
          "shape": "circle",
          "size": 8.0,
          "x:double array": "AAAAAAAAAAAAAAAAAADwPwAAAAAAAABAAAAAAAAACEAAAAAAAAAQQAAAAAAAABRAAAAAAAAAGEAAAAAAAAAcQAAAAAAAACBAAAAAAAAAIkAAAAAAAAAkQAAAAAAAACZAAAAAAAAAKEAAAAAAAAAqQAAAAAAAACxAAAAAAAAALkAAAAAAAAAwQAAAAAAAADFAAAAAAAAAMkAAAAAAAAAzQAAAAAAAADRAAAAAAAAANUAAAAAAAAA2QAAAAAAAADdAAAAAAAAAOEAAAAAAAAA5QAAAAAAAADpAAAAAAAAAO0AAAAAAAAA8QAAAAAAAAD1AAAAAAAAAPkAAAAAAAAA/QAAAAAAAAEBAAAAAAACAQEAAAAAAAABBQAAAAAAAgEFAAAAAAAAAQkAAAAAAAIBCQAAAAAAAAENAAAAAAACAQ0AAAAAAAABEQAAAAAAAgERAAAAAAAAARUAAAAAAAIBFQAAAAAAAAEZAAAAAAACARkAAAAAAAABHQAAAAAAAgEdAAAAAAAAASEAAAAAAAIBIQAAAAAAAAElA",
          "y:double array": "AAAAAAAAAAAe3YkrC9+RPyfc98lY3qE/DcnvSMfLqj8oUWptj9uxPwKBwrjWT7Y/a1c8m2DCuj/TYk9M1DK/PxmejZZs0ME/dVOoZwsGxD+Jcwt+GjrGP09idt1tbMg/9VhCrNmcyj90xs02MsvMPx255PJL984/kAaTwX2Q0D8pjjLdCqTRP8fVg883ttI/T+kvN+/G0z/czQDQG9bUP/ULinSo49U/PNPOH4Dv1j+BluXujfnXP6r/mCK9Adk/0BoGIfkH2j9TmDd3LQzbP8gFvtpFDtw/AN5EKy4O3T95UCR00gveP+2g7+0eB98/////////3z8T3/0gMXvgPyrdrD4Z9eA/HHdw165t4T8S/RGE6OThP3hJfPi8WuI/Xlp1BCPP4j+2vlWUEULjPznJvbF/s+M/vnpIhGQj5D8cFjxSt5HkP9RPOIFv/uQ/2AviloRp5T8rnIw57tLlPxBz4DCkOuY/zDt/Zp6g5j84TaXm1ATnP4JpyOA/Z+c/wb4zqNfH5z82HKG0lCboPzlQz6Jvg+g/"
        }
      }
    ],
    "DateTime:datetime": "2015-01-01T00:00:00",
    "EmptyArray:object array": [],
    "Integer:int": 2015,
    "List:int list": [
      {
        ":int": 1
      },
      {
        ":int": 2
      },
      {
        ":int": 3
      },
      {
        ":int": 4
      },
      {
        ":int": 5
      },
      {
        ":int": 6
      },
      {
        ":int": 7
      },
      {
        ":int": 8
      },
      {
        ":int": 9
      },
      {
        ":int": 10
      }
    ],
    "Null": null,
    "Real": 3.1415926535897931,
    "Record:record": {
      "Age:int": 25,
      "Dogs": [
        "Alba",
        "Eva"
      ],
      "Name": "Adam"
    },
    "String": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in mauris ullamcorper, porttitor lorem ac, finibus lectus. Nullam et ex tortor. Vestibulum eleifend justo erat, eu convallis tellus elementum eu. Nam vestibulum vehicula justo, eget rhoncus diam vehicula ac. Aenean sit amet sollicitudin leo, cursus tincidunt nibh. Nam lacinia dolor ut metus tristique eleifend. Vestibulum felis mauris, dapibus vel mauris vel, consectetur condimentum urna. Proin vulputate, velit nec fermentum consequat, lectus sapien hendrerit tellus, vitae vulputate sem odio ut quam. Mauris eget pulvinar lacus. Praesent elementum accumsan sapien, in accumsan augue. Vestibulum consectetur volutpat arcu vel varius. Vivamus venenatis mi eget velit pellentesque aliquam at eget lectus. Nam at ex purus. Nullam a dui a urna pellentesque rutrum a faucibus sapien.\r\n\r\nDonec a orci sodales, porttitor nulla eget, euismod tellus. Proin vel neque ullamcorper ex consectetur ullamcorper. Donec hendrerit efficitur est, eget congue augue condimentum id. Phasellus non purus at diam feugiat convallis sed a sem. Phasellus in elit sagittis, aliquam lorem id, tincidunt dui. Nam nec leo neque. Praesent pulvinar vel leo nec fringilla. Phasellus cursus convallis metus ac ullamcorper. Sed tempus, odio et tempus pharetra, leo velit convallis nisi, molestie mollis enim magna rhoncus felis. Pellentesque venenatis dui magna, sed hendrerit turpis lacinia eget. Fusce in justo ac justo rutrum scelerisque sit amet nec metus. Ut fringilla massa sed quam gravida congue vulputate ut justo. Morbi vel condimentum tellus, a ultricies leo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.\r\n\r\nFusce ornare non risus quis sodales. Pellentesque dapibus semper eleifend. Nullam eu feugiat leo. Etiam semper massa id ipsum feugiat bibendum. Mauris nec lacus porta, dapibus orci eu, pretium ex. Nulla ornare, velit ac mollis tincidunt, tellus mi porta nisi, et luctus massa lorem non sem. Vivamus ullamcorper tincidunt quam, in ultricies urna malesuada non. Cras venenatis facilisis dignissim. Nam commodo dapibus pharetra. Curabitur dui ipsum, tincidunt posuere dapibus at, dignissim a ex. Maecenas eu diam libero. Integer et ante interdum, sollicitudin magna ut, consectetur nisi. Proin egestas est sed mauris rhoncus egestas.\r\n\r\nNullam nec molestie urna. Nullam purus nisl, elementum ac nisl pulvinar, blandit pharetra augue. Praesent finibus pellentesque egestas. Pellentesque pellentesque commodo lacus a congue. Integer malesuada massa vitae felis malesuada, id viverra nulla semper. Etiam tristique elit massa, nec molestie orci blandit id. Integer vehicula dapibus lorem, eu efficitur magna lacinia vel. Ut in elementum elit, sit amet lacinia tortor.\r\n\r\nVestibulum vitae enim sed dui pharetra tristique. Donec maximus elementum maximus. Fusce scelerisque enim ex, quis aliquam nibh scelerisque eu. Nullam lacinia diam felis. Fusce laoreet tortor quis ex pellentesque finibus. Suspendisse sit amet augue mauris. In libero diam, hendrerit pharetra justo at, cursus aliquam justo.",
    "Tuple:tuple<string,int>": [
      "Hello World!",
      {
        ":int": 42
      }
    ]
  }
}

Marshal an object to JSON using one method call

As a user of Angara.Serialization.Json, I want to have a method which takes an object and a resolver and returns a Json as a string (and another method for back transformation), so that I could use Angara.Serialization.Json to convert .NET object to JSON with exact transformation, optimal array encoding and type-information available.

Remarks

Now when I need to convert an object to JSON I should do two steps: conver object to InfoSet; convert InfoSet to Json. Meanwhile for me there is no need to know anything about the intermediate infoSet:

let infoSet = Angara.Serialization.ArtefactSerializer.Serialize resolver artefact
let json = Angara.Serialization.Json.Marshal(infoSet, None)

Why not the Angara.Serialization.Json to have one method for this common operation:

let json = Angara.Serialization.Json.FromObject(artefact, resolver)

And back:

let artefact = Angara.Serialization.Json.ToObject(json, resolver)
let artefact = Angara.Serialization.Json.ToObject<Artefact>(json, resolver)

Allow serializers for a generic type

I need serialization of generic types.

Let I have a generic type:

type T<'a>(a: 'a) =
   member x.A = a

I want to serialize instances of this type T(10), T("abc") and would create a serializer type as follows:

let TSerializer<'a>() =
  interface ISerializer<'a> with
    member x.TypeId = "T"
    member x.Serialize _ t -> ...
    member x.Deserializer _ is -> ...

Now only non-generic serializers can be registered in a serializer library. But still it seems possible to do the following, if a serializer type has same order and number of type parameters as its target type:

lib.Register(typedefof<TSerializer<_>>)

NuGet package targets .NET 4.6.1 only

Adding the Angara.Base nuget package fails with
Could not install package 'Angara.Serialization 0.1.2'. You are trying to install this package into a project that targets '.NETFramework,Version=v4.5',but the package does not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author.
for frameworks: 4.0, 4.5, 4.5.1, 4.5.2, 4.6

Works only targeting 4.6.1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.