GithubHelp home page GithubHelp logo

epicserializer's Introduction

EpicSerializer

Epic Chronicles Format Serializer

https://www.nuget.org/packages/EpicSerializer

Epic is a very popular Electronic Medical Record system, with a proprietary format for bulk importing data through their Chronicles tool. This library makes it easy to serialize arbitrary types into the Chronicles format, which resembles an OrderedMap<int, string>. Since Epic configurations can vary so widely among different installations, this library doesn't make any assumptions about how any particular instance is configured.

The library is designed to be scalable, it only performs introspection on your serializable types once, on it's first encounter with that type. During this encounter it creates an access plan that describes how to pull data out of the objects of this type. These plans are stored in a static thread-safe container, so all instances of the Serializer benefit.

Chronicles Format Example:
1,12345
2,Biff Jutsu
45,biffj
50,1
2301,ARNP
2302,WA
2303,ABC123456
2301,RN
2302,WA
2303,DEF789012
1,67890
2,Some Other Person
45,otherp
50,1
...

Code

Simple single object example.

[EpicSerializable(MasterFile.EMP)]
class EpicUser
{
    [EpicRecord(Field: 1)]
    public int EpicID { get; set; }

    [EpicRecord(Field: 2)]
    public string Name { get; set; }

    [EpicRecord(Field: 45)]
    public string Username { get; set; }

    [EpicRecord(Field: 50)]
    public bool Active { get; set; }
}

var user = new EpicUser
{
    EpicID = 12345,
    Name = "Biff Jutsu",
    Username = "biffj",
    Active = true
};

var serial = new EpicSerializer<EpicUser>();
string serializedResult = serial.Serialize(user);
Console.WriteLine(serializedResult);

// Console Output
1,12345
2,Biff Jutsu
45,biffj
50,1

Single object with simple repeated section.

[EpicSerializable(MasterFile.EMP)]
class EpicUser
{
    [EpicRecord(Field: 1)]
    public int EpicID { get; set; }

    [EpicRecord(Field: 2)]
    public string Name { get; set; }

    [EpicRecord(Field: 45)]
    public string Username { get; set; }

    [EpicRecord(Field: 50)]
    public bool Active { get; set; }

    [EpicRepeat(Field: 100)]
    public List<string> Locations { get; set; }
}

var user = new EpicUser
{
    EpicID = 12345,
    Name = "Biff Jutsu",
    Username = "biffj",
    Active = true,
    Locations = new List<string>
    {
        "Hospital",
        "Burn Ward"
    }
};

var serial = new EpicSerializer<EpicUser>();
string serializedResult = serial.Serialize(user);
Console.WriteLine(serializedResult);

// Console Output
1,12345
2,Biff Jutsu
45,biffj
50,1
100,Hospital
100,Burn Ward

Single object with complex repeated section.

[EpicSerializable(MasterFile.EMP)]
class EpicUser
{
    [EpicRecord(Field: 1)]
    public int EpicID { get; set; }

    [EpicRecord(Field: 2)]
    public string Name { get; set; }

    [EpicRecord(Field: 45)]
    public string Username { get; set; }

    [EpicRecord(Field: 50)]
    public bool Active { get; set; }

    [EpicRepeat(Field: 100)]
    public List<string> Locations { get; set; }

    [EpicRepeat(Field: 2301)]
    public List<License> Licenses { get; set; }
}

[EpicSerializable(MasterFile.EMP)]
class License
{
    [EpicRecord(Field: 2301)]
    public string Type { get; set; }

    [EpicRecord(Field: 2302)]
    public string State { get; set; }

    [EpicRecord(Field: 2303)]
    public string Value { get; set; }
}

var user = new EpicUser
{
    EpicID = 12345,
    Name = "Biff Jutsu",
    Username = "biffj",
    Active = true,
    Locations = new List<string>
    {
        "Hospital",
        "Burn Ward"
    },
    Licenses = new List<License>
    {
        new License
        {
            Type = "ARNP",
            State = "WA",
            Value = "ABC123456"
        },
        new License
        {
            Type = "RN",
            State = "WA",
            Value = "DEF789012"
        }
    }
};

var serial = new EpicSerializer<EpicUser>();
string serializedResult = serial.Serialize(user);
Console.WriteLine(serializedResult);

// Console Output
1,12345
2,Biff Jutsu
45,biffj
50,1
100,Hospital
100,Burn Ward
2301,ARNP
2302,WA
2303,ABC123456
2301,RN
2302,WA
2303,DEF789012

See tests for more detailed examples.

epicserializer's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

epicserializer's Issues

Remove type list duplication

Move Attribute type list checks to use TypeMap keys.

The Attributes could just return the keys of the TypeMap dictionaries, just looking to remove this duplication.

EpicSerializerImpl.Convert default case should continue

Although it works right now, due to the last String.IsNullOrWhitespace check, we can short-circuit that loop and continue if the tagged member is on anything other than a field or property.

            switch (ma.MemberType)
            {
                case MemberTypes.Field:
                    o = SerialType.GetField(ma.Name).GetValue(record);
                    break;
                case MemberTypes.Property:
                    o = SerialType.GetProperty(ma.Name).GetValue(record);
                    break;
                default:
                    break; // continue;
            }

Add deserialization functionality

Adding deserialization functionality would let this library provide full bi-directional marshalling capabilities.

Those using InterConnect or FHIR would be able to use this library in middleware for real-time services.

Convert to C# 7

Use new language features like pattern matching and local functions to clean up conversions.

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.