web-dev-qa-db-fra.com

Comment convertir un tableau d'octets en n'importe quel type

ok les gars, je vois des questions de personnes demandant comment convertir des tableaux d'octets en int, string, Stream, etc ... et les réponses sont toutes variables et Je n'ai personnellement trouvé aucune réponse satisfaisante.

Voici donc certains types auxquels nous voulons convertir un tableau d'octets.

UnityEngine.Font qui peut prendre des données ttf.

UnityEngine.Testure2D qui peut prendre des données à partir de fichiers image comme .png, .jpg, etc...

Comment convertir un tableau d'octets en String, UnityEngine.Testure2D,UnityEngine.Font, Bitmap, etc ...

Les données qui remplissent le tableau d'octets doivent provenir d'un type de fichier dont les données peuvent être gérées par le type auquel nous voulons convertir le tableau d'octets?

Est-ce actuellement possible?

Toute aide serait appréciée.

15
user4740550

Les types primitifs sont faciles car ils ont une représentation définie sous la forme d'un tableau d'octets. Les autres objets ne le sont pas car ils peuvent contenir des éléments qui ne peuvent pas être persistés, comme les descripteurs de fichiers, les références à d'autres objets, etc.

Vous pouvez essayer de persister un objet dans un tableau d'octets en utilisant BinaryFormatter :

public byte[] ToByteArray<T>(T obj)
{
    if(obj == null)
        return null;
    BinaryFormatter bf = new BinaryFormatter();
    using(MemoryStream ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

public T FromByteArray<T>(byte[] data)
{
    if(data == null)
         return default(T);
    BinaryFormatter bf = new BinaryFormatter();
    using(MemoryStream ms = new MemoryStream(data))
    {
        object obj = bf.Deserialize(ms);
        return (T)obj;
    }
}

Mais tous les types ne sont pas sérialisables. Il n'y a aucun moyen de "stocker" une connexion à une base de données, par exemple. Vous pouvez stocker les informations utilisées pour créer la connexion (comme la chaîne de connexion) mais vous ne pouvez pas stocker l'objet de connexion réel.

32
D Stanley