Marshalling (datavetenskap)

Inom datavetenskap är marshalling eller marshaling ( amerikansk stavning ) processen att omvandla minnesrepresentationen av ett objekt till ett dataformat som är lämpligt för lagring eller överföring . [ citat behövs ] Det används vanligtvis när data måste flyttas mellan olika delar av ett datorprogram eller från ett program till ett annat.

Marshalling kan vara något liknande eller synonymt med serialisering . Marshalling är att beskriva en avsikt eller process att överföra något objekt från en klient till server, avsikten är att ha samma objekt som finns i ett program som körs, att vara närvarande i ett annat program som körs, dvs objekt på en klient som ska överföras till och finns på servern. Serialisering har inte nödvändigtvis denna avsikt eftersom den bara handlar om att omvandla data till en, till exempel, ström av byte. Man kan säga att rangering kan göras på något annat sätt från serialisering, men någon form av serialisering används vanligtvis.

Det förenklar komplex kommunikation, eftersom den använder sammansatta objekt för att kommunicera istället för primitiva objekt . Den omvända processen av rangering kallas unmarshalling (eller demarshalling , liknande deserialisering ). Ett unmarshalling-gränssnitt tar ett serialiserat objekt och omvandlar det till en intern datastruktur.

Den exakta definitionen av rangordning skiljer sig åt mellan programmeringsspråk som Python , Java och .NET , och används i vissa sammanhang omväxlande med serialisering.

Jämförelse med serialisering

Att " serialisera " ett objekt innebär att konvertera dess tillstånd till en byteström på ett sådant sätt att byteströmmen kan konverteras tillbaka till en kopia av objektet.

Termen "marskalk" används för en specifik typ av "serialisering" i Pythons standardbibliotek - lagring av interna pythonobjekt:

Marskalmodulen finns huvudsakligen för att stödja läsning och skrivning av den "pseudo-kompilerade" koden för Python-moduler av .pyc-filer.

Om du serialiserar och avserialiserar Python-objekt, använd pickle-modulen istället

Python Standard Library

  I den Java-relaterade RFC 2713 används rangering vid serialisering av objekt för fjärranrop. Ett objekt som är sorterat registrerar det ursprungliga objektets tillstånd och det innehåller kodbasen (kodbas hänvisar här till en lista med URL:er där objektkoden kan laddas från, och inte källkoden). Därför, för att konvertera objekttillståndet och kodbasen(-erna), måste demontering göras. Unmarshaller-gränssnittet konverterar automatiskt den sorterade data som innehåller kodbas(er) till ett körbart Java-objekt i JAXB. Alla föremål som kan deserialiseras kan avmarkeras. Det omvända behöver dock inte vara sant.

Att "marshalera" ett objekt betyder att registrera dess tillstånd och kodbas(er) på ett sådant sätt att när det rangordnade objektet är "unmarshalled", erhålls en kopia av det ursprungliga objektet, möjligen genom att automatiskt ladda klassdefinitionerna för objektet. Du kan sortera vilket objekt som helst som är serialiserbart eller fjärrstyrt (det vill säga implementerar java.rmi.Remote-gränssnittet). Marshalling är som serialisering, förutom att rangering också registrerar kodbaser. Marshalling skiljer sig från serialisering genom att rangering behandlar avlägsna föremål speciellt.

Alla objekt vars metoder kan anropas [på ett objekt i en annan virtuell Java-maskin] måste implementera java.rmi.Remote-gränssnittet. När ett sådant objekt anropas, rangordnas dess argument och skickas från den lokala virtuella maskinen till den avlägsna, där argumenten delas upp och används.

Schema för att representera Java(tm)-objekt i en LDAP-katalog (RFC 2713)

I Microsoft .NET används rangering också för att referera till serialisering vid användning av fjärranrop:

När du sorterar ett objekt efter värde skapas en kopia av objektet och serialiseras till servern. Alla metodanrop som görs på det objektet görs på servern

Hur man placerar ett objekt till en fjärrserver efter värde genom att använda Visual Basic .NET (Q301116)

Användande

Marshalling används inom implementeringar av olika remote procedure call (RPC) mekanismer, där det är nödvändigt att transportera data mellan processer och/eller mellan trådar . I Microsofts Component Object Model (COM) måste gränssnittspekare ordnas när man korsar COM-lägenhetsgränser. I .NET Framework är konverteringen mellan en ohanterad typ och en CLR- typ, som i P/Invoke -processen, också ett exempel på en åtgärd som kräver att rangering ska ske.

Dessutom används marshalling flitigt inom skript och applikationer som använder XPCOM -teknologier som tillhandahålls inom Mozilla-applikationsramverket . Webbläsaren Mozilla Firefox är en populär applikation byggd med detta ramverk, som dessutom tillåter skriptspråk att använda XPCOM genom XPConnect (Cross-Platform Connect).

Exempel

I Microsoft Windows- familjen av operativsystem är hela uppsättningen drivrutiner för Direct3D kärnlägesdrivrutiner. Användarlägesdelen av API:t hanteras av DirectX-körtiden som tillhandahålls av Microsoft.

Detta är ett problem eftersom anrop av kärnlägesoperationer från användarläge kräver att ett systemanrop utförs , och detta tvingar oundvikligen processorn att byta till "kärnläge". Detta är en långsam operation, som tar ungefär mikrosekunder att slutföra. Under denna tid kan CPU:n inte utföra några operationer. Som sådan skulle en minimering av antalet gånger denna omkopplingsoperation måste utföras optimera prestandan i väsentlig grad.

Linux OpenGL-drivrutiner är uppdelade i två: en kärndrivrutin och en drivrutin för användarutrymme. Drivrutinen för användarutrymmet gör all översättning av OpenGL -kommandon till maskinkod som ska skickas till GPU:n . För att minska antalet systemanrop implementerar användarutrymmesföraren rangering. Om GPU:ns kommandobuffert är full av renderingsdata kan API:et helt enkelt lagra det begärda renderingsanropet i en temporär buffert och, när kommandobufferten är nära att vara tom, kan den utföra en växling till kärnläge och lägga till ett antal lagrade kommandon på en gång.

Format

XML är ett sätt att överföra data mellan system. Microsoft använder det till exempel som grund för filformaten för de olika komponenterna (Word, Excel, Access, PowerPoint, etc.) i Microsoft Office-paketet (se Office Open XML ). Även om detta vanligtvis resulterar i ett utförligt trådformat, tillåter XMLs "starttagg", "sluttagg"-syntax att tillhandahålla mer exakt diagnostik och enklare återställning från överförings- eller diskfel. Dessutom, eftersom taggarna förekommer upprepade gånger, kan man använda vanliga komprimeringsmetoder för att krympa innehållet – alla Office-filformat skapas genom att zippa den råa XML-filen. Alternativa format som JSON (JavaScript Object Notation) är mer kortfattade, men på motsvarande sätt mindre robusta för felåterställning.

När data väl har överförts till ett program eller en applikation måste den konverteras tillbaka till ett objekt för användning. Följaktligen används avmarshalling i allmänhet i mottagaränden av implementeringarna av Remote Method Invocation (RMI) och Remote Procedur Call (RPC) mekanismer för att ta bort sända objekt i en exekverbar form.

JAXB

JAXB eller Java Architecture for XML Binding är det vanligaste ramverket som används av utvecklare för att samla och dela upp Java-objekt. JAXB tillhandahåller interkonvertering mellan grundläggande datatyper som stöds av Java och vanliga XML-schemadatatyper .

XmlSerializer

XmlSerializer är ramverket som används av C# -utvecklare för att samla och dela upp C#-objekt. En av fördelarna med C# jämfört med Java är att C# har inbyggt stöd för marshalling på grund av inkluderingen av XmlSerializer-klassen. Java, å andra sidan, kräver en icke-inbyggd limkod i form av JAXB för att stödja rangering.

XML och körbar representation

Ett exempel på unmarshalling är konverteringen av en XML-representation av ett objekt till standardrepresentationen av objektet i vilket programmeringsspråk som helst. Tänk på följande klass.

  

      
      
      
    
         
    
      
    
         
    
      
    
          
    
      
    
          
    
 public  class  Student  {  private  char  name  [  150  ]  ;  privat  int  ID  ;  public  String  getName  ()  {  returnera  detta  .  namn  ;  }  public  int  getID  ()  {  returnera  detta  .  ID  ;  }  void  setName  (  String  name  )  {  this  .  namn  =  namn  ;  }  void  setID  (  int  ID  )  {  detta  .  ID  =  ID  ;  }  } 
  • - representation av studentobjekt :



     
        
    
     
        
     <!-- Kodavsnitt 1 -->  <?xml version="1.0" encoding="UTF-8"?>  <student-  id=  "11235813"  >  <namn>  Jayaraman  </name>  </student>  <student-  id =  "21345589"  >  <namn>  Shyam  </name>  </student> 
  • Körbar representation av studentobjekt :


    


    

 // Code Snippet 2  Student  s1  =  new  Student  ();  s1  .  setID  (  11235813  );  s1  .  setName  (  "Jayaraman"  );  Student  s2  =  ny  Student  ();  s2  .  setID  (  21345589  );  s2  .  setName  (  "Shyam"  ); 

Unmarshalling konverterar XML-representationen av Code Snippet 1 till den körbara Java-representationen av Code Snippet 2 som standard.

Unmarshalling i Java

Unmarshaller i JAXB

Processen att dela upp XML-data till ett körbart Java-objekt tas om hand av den inbyggda Unmarshaller-klassen. Unmarshal-metoderna som definieras i Unmarshaller-klassen är överbelastade för att acceptera XML från olika typer av indata som en fil, FileInputStream eller URL. Till exempel:

   
   
     JAXBContext  jcon  =  JAXBContext  .  newInstance  (  "com.acme.foo"  );  Unmarshaller  umar  =  jcon  .  skapaUnmarshaller  ();  Objekt  obj  =  umar  .  unmarshal  (  ny  fil  (  "input.xml"  )); 

Unmarshalling XML-data

Unmarshal-metoder kan deserialisera ett helt XML-dokument eller en liten del av det. När XML-rotelementet är globalt deklarerat, använder dessa metoder JAXBContexts mappning av XML-rotelement till JAXB-mappade klasser för att initiera unmarshalling. Om mappningarna inte är tillräckliga och rotelementen deklareras lokalt, använder unmarshal-metoderna declaredType-metoder för unmarshalling-processen. Dessa två tillvägagångssätt kan förstås nedan.

Unmarshal ett globalt XML-rotelement

Unmarshal-metoden använder JAXBContext för att ta bort XML-data, när rotelementet är globalt deklarerat. JAXBContext-objektet upprätthåller alltid en mappning av det globalt deklarerade XML-elementet och dess namn till en JAXB-mappad klass. Om XML-elementets namn eller dess @xsi:type -attribut matchar den JAXB-mappade klassen, transformerar unmarshal-metoden XML-data med hjälp av lämplig JAXB-mappad klass. Men om XML-elementets namn inte matchar kommer unmarshal-processen att avbryta och kasta en UnmarshalException . Detta kan undvikas genom att använda unmarshal by declaredType-metoder.

Unmarshal ett lokalt XML-rotelement

När rotelementet inte deklareras globalt, hjälper applikationen unmarshaller genom applikationsförsedd mappning med declaredType-parametrar. I en prioritetsordning, även om rotnamnet har en mappning till en lämplig JAXB-klass, åsidosätter den declaredType mappningen. Men om @xsi:type för XML-data har en mappning till en lämplig JAXB-klass, har detta företräde framför parametern declaredType. Unmarshal-metoderna av declaredType-parametrar returnerar alltid en JAXBElement<declaredType> -instans. Egenskaperna för den här JAXBElement-instansen är inställda enligt följande:

JAXBElement Property Värde
namn xml-elementnamn
värde instans av declaredType
declaredType unmarshal method declaredType parameter
omfattning null (verklig storlek är inte känd)

Se även