Binární data v AX2012

K manipulaci binárních dat (např. binárních souborů včetně obrázků, serializovaných objektů apod.) slouží zejména třídy BinData, BinaryIo a Binary. Zatímco první dvě jsou v AX2012 stejné jako v AX2009, třídě Binary přibylo několik užitečných metod:

public static Binary constructFromContainer(container _data)
public static Binary constructFromMemoryStream(CLRObject _memoryStream)
public container getContainer()
public CLRObject getMemoryStream()

Binary tedy může sloužit jako jednoduché rozhraní mezi AX (používající kontejnery) a datovými proudy v prostředím .NET. Jak to může být užitečné a jak snadné to je demonstrují příklady níže.

Následující X++ kód načte obsah souboru do proměnné typu FileStream, předá do MemoryStream a přes Binary vloží data do X++ kontejneru:

System.IO.FileStream fileStream = System.IO.File::OpenRead(filename);
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
int size = fileStream.get_Length();
container con;
 
memoryStream.SetLength(size);
fileStream.Read(memoryStream.GetBuffer(), 0, size); //zápis do MemoryStream
con = Binary::constructFromMemoryStream(memoryStream).getContainer(); //z MemoryStream do kontejneru

Druhý příklad je v C# a vyžaduje proxy pro X++ třídy Image a Binary. Načte obrázek z AX pomocí resource ID a použije ho na tlačítku ve WPF:

//Načte obrázek s transparentním pozadím z AX
Image axImage = new Image();
axImage.loadResource(1030); //ID nějakého obrázku
axImage.saveType(ImageSaveType.PNG);
 
//Vytvoří datový proud
Binary binary = Binary.constructFromContainer(axImage.getData());
MemoryStream stream = (MemoryStream)binary.getMemoryStream();
 
//Vytvoří System.Windows.Media.Imaging.BitmapImage
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = memoryStream;
bitmap.EndInit();
 
//Nastaví obrázek na tlačítko
var wpfImage = new System.Windows.Controls.Image();
wpfImage.Source = bitmap;
button1.Content = wpfImage;