Avatar billede postbil Nybegynder
24. april 2015 - 07:45 Der er 10 kommentarer og
1 løsning

Konverter list<> til byte[] eller memorystream

Hej Eksperter.
Jeg har en list<struct> som jeg ønsker at konverter til byte[] eller  memorystream.
Kan jeg det og i så fald hvordan gøres det nemmest?
Her ses koden for min list<>
List<ST_Log> data = new List<ST_Log>();

public struct ST_Log
    {
        public int ProjectId;
        public int ChannelNumber;
        public int Value;
        public DateTime CreationTime;
        public bool Delete;
        public bool Invalid;
    }

Grunden til at jeg ønsker at konverter denne list er at den skal komprimeres med ZLIB og sendes til en database.
Hilsen Mik
Avatar billede sonalias Seniormester
24. april 2015 - 08:24 #1
byte[] dataAsBytes = ST_Log.SelectMany(s => Text.Encoding.UTF8.GetBytes(s))
  .ToArray();

http://stackoverflow.com/questions/11308749/convert-generic-liststring-to-byte
Avatar billede MADOlsen Forsker
24. april 2015 - 10:57 #2
Du skal lige huske at følge op på dine åbne spørgsmål:
http://www.eksperten.dk/list/spoergsmaal/postbil
Avatar billede postbil Nybegynder
24. april 2015 - 11:47 #3
Fantastisk mange tak -det var meget brugbart.
God weekend.
Avatar billede sonalias Seniormester
24. april 2015 - 14:11 #4
Antager det var mit svar du brugte :)
Avatar billede arne_v Ekspert
25. april 2015 - 04:11 #5
Jeg forstaar ikke den loesning.

Opgaven var at hente bytes fra en List as struct - loesningen henter bytes fra en List af string.

Endvidere er loesningen envejs d.v.s. at original data kan ikke genskabes, hvilket formentligt ikke er hensigtsmaessigt ved gem i database.
Avatar billede postbil Nybegynder
25. april 2015 - 11:10 #6
Ohhh - Okay så har jeg et nyt problem. Jeg er ikke kommet til den del af projektet hvor dataene skal genskabes.

Hvad er din vurdering, er det umuligt at komprimere sådan en list? eller har du et forslag hvordan jeg kan komprimere en række structs og gemme dem i en database?
Avatar billede arne_v Ekspert
26. april 2015 - 00:23 #7

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;

namespace E
{
    [Serializable]
    public struct ST_Log
    {
        public int ProjectId;
        public int ChannelNumber;
        public int Value;
        public DateTime CreationTime;
        public bool Delete;
        public bool Invalid;
    }
    internal static class SerUtil<T>
    {
        public static byte[] Object2ByteArray(T o)
        {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, o);
            return ms.ToArray();
        }
        public static string Object2String(T o)
        {
            return Convert.ToBase64String(Object2ByteArray(o));
        }
        public static T ByteArray2Object(byte[] b)
        {
            MemoryStream ms = new MemoryStream(b);
            BinaryFormatter bf = new BinaryFormatter();
            ms.Position = 0;
            return (T)bf.Deserialize(ms);
        }
        public static T String2Object(string s)
        {
            return ByteArray2Object(Convert.FromBase64String(s));
        }
    }
    public class Program
    {
        // this does not compile
        /*
        public static byte[] Proposed<T>(List<T> data)
        {
            return data.SelectMany(s => Encoding.UTF8.GetBytes(s)).ToArray();   
        }
        */
        public static byte[] ProposedModified<T>(List<T> data)
        {
            return data.SelectMany(elm => Encoding.UTF8.GetBytes(elm.ToString())).ToArray();
        }
        public static byte[] PlainBinarySerialization<T>(List<T> data)
        {
            return SerUtil<List<T>>.Object2ByteArray(data);
        }
        public static byte[] CompressingBinarySerialization<T>(List<T> data)
        {
            MemoryStream ms = new MemoryStream();
            GZipStream cmp = new GZipStream(ms, CompressionMode.Compress);
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(cmp, data);
            cmp.Close();
            return ms.ToArray();

        }
        public static void Test<T>(List<T> data, Func<List<T>, byte[]> f, string lbl)
        {
            byte[] b = f(data);
            Console.WriteLine("{0} : {1}", lbl, b.Length);
        }
        public static void Main(string[] args)
        {
            List<ST_Log> data = new List<ST_Log> { new ST_Log { ProjectId=1, ChannelNumber=1, Value=123, CreationTime=DateTime.Now, Delete=false, Invalid=false },
                                                  new ST_Log { ProjectId=2, ChannelNumber=1, Value=456, CreationTime=DateTime.Now, Delete=false, Invalid=false },
                                                  new ST_Log { ProjectId=3, ChannelNumber=1, Value=789, CreationTime=DateTime.Now, Delete=false, Invalid=false },
                                                  new ST_Log { ProjectId=4, ChannelNumber=1, Value=123, CreationTime=DateTime.Now, Delete=false, Invalid=false },
                                                  new ST_Log { ProjectId=5, ChannelNumber=1, Value=456, CreationTime=DateTime.Now, Delete=false, Invalid=false } };
            //Test(data, Proposed, "Proposed for List<string>"); // can't call a method not compiling
            Test(data, ProposedModified, "Proposed for List<string> modified to List<T>");
            // but let us see if it is possible to get back original data
            Console.WriteLine("Try get back original data from this: {0}", Encoding.UTF8.GetString(ProposedModified(data)));
            // OK - let us try to be serious
            Test(data, PlainBinarySerialization, "Plain binary serializer");
            Test(data, CompressingBinarySerialization, "Compressing binary serializer");
            Console.ReadKey();
        }
    }
}
Avatar billede postbil Nybegynder
27. april 2015 - 09:37 #8
MANGE TAK!! Det er jeg ganske sikker på jeg aldrig selv var kommet frem til!! Det vil jeg arbejde videre med!!

Endnu engang Tak for din hjælp!!
Avatar billede arne_v Ekspert
27. april 2015 - 15:01 #9
BinaryFormatter har naturligvis ogsaa en Deserialize metode, saa du kan faa original data tilbage.
Avatar billede arne_v Ekspert
27. april 2015 - 15:02 #10
Og du er naturligvis opmaerksom paa at gemme data paa den maade i en database overtraeder alle database design principper.
Avatar billede postbil Nybegynder
30. april 2015 - 19:58 #11
Ja jeg er godt klar over at det er i strid med de normale principper for god database skik. men mængden af data i dette til fælde vil ret hurtigt blive flere terabyte. Så det er grunden til at jeg vælger at komprimere dataene på denne måde.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester