C# 使用二进制格式(u-sql)写入和读取对象

C# 使用二进制格式(u-sql)写入和读取对象,c#,code-behind,u-sql,binaryformatter,C#,Code Behind,U Sql,Binaryformatter,因此,我目前正在尝试创建两个U-sql脚本,其中一个脚本将特定对象写入文件,另一个脚本读取文件并获取对象 编写U-sql脚本: @bloomTest = EXTRACT date DateTime, region string, tenantName string, fileName string, modifyingUsers string, firstAccess

因此,我目前正在尝试创建两个U-sql脚本,其中一个脚本将特定对象写入文件,另一个脚本读取文件并获取对象

编写U-sql脚本:

@bloomTest =
    EXTRACT date DateTime,
            region string,
            tenantName string,
            fileName string,
            modifyingUsers string,
            firstAccess string,
            lastAccess string
    FROM "SearchLog.tsv"
    USING Extractors.Tsv();

@rs0 =
    SELECT sqlProjsend.Send.send(region) AS Obj
    FROM @bloomTest;


OUTPUT @rs0
TO "/output/bloomtestSend.csv"
USING Outputters.Csv();
编写代码隐藏:

 public static class Send
    {

        public static string send(string s)
        {
            IBloomfilter bloom = new BloomFilter(52);

            bloom.Add("hello");

            byte[] bArr = Serialize(bloom);
            return "|" + BitConverter.ToString(bArr).Replace("-", "") + "|";
        }




        static byte[] Serialize(IBloomfilter bloom)
        {
            MemoryStream stream = new MemoryStream();
            IFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, bloom);
            return stream.ToArray();
        }
    }
public static class Recieve
    {   
        public static string recv(string b)
        {

            string[] ss = b.Split('|');

            IBloomfilter bloom = Deserialize(StringToByteArray(ss[1]));

            string[] strings = new string[3];
            strings[0] = "nice";
            strings[1] = "world";
            strings[2] = "hello";

            string retVal = "";
            foreach(string s in strings)
            {

            }
            return retVal;
        }

        public static byte[] StringToByteArray(String hex)
        {
            int NumberChars = hex.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
        private static IBloomfilter Deserialize(byte[] param)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                ms.Write(param, 0, param.Length);
                IFormatter br = new BinaryFormatter();
                ms.Position = 0;
                return br.Deserialize(ms) as BloomFilter;
            }
        }
    }
接收脚本:

@bloomTest =
    EXTRACT bloom string

    FROM "/output/bloomtestSend.csv"
    USING Extractors.Csv();

@rs0 =
    SELECT sqlProjrecv.Recieve.recv(bloom) AS bloomRes
    FROM @bloomTest;


OUTPUT @rs0
TO "/output/bloomtestRecv.csv"
USING Outputters.Csv();
接收代码隐藏:

 public static class Send
    {

        public static string send(string s)
        {
            IBloomfilter bloom = new BloomFilter(52);

            bloom.Add("hello");

            byte[] bArr = Serialize(bloom);
            return "|" + BitConverter.ToString(bArr).Replace("-", "") + "|";
        }




        static byte[] Serialize(IBloomfilter bloom)
        {
            MemoryStream stream = new MemoryStream();
            IFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, bloom);
            return stream.ToArray();
        }
    }
public static class Recieve
    {   
        public static string recv(string b)
        {

            string[] ss = b.Split('|');

            IBloomfilter bloom = Deserialize(StringToByteArray(ss[1]));

            string[] strings = new string[3];
            strings[0] = "nice";
            strings[1] = "world";
            strings[2] = "hello";

            string retVal = "";
            foreach(string s in strings)
            {

            }
            return retVal;
        }

        public static byte[] StringToByteArray(String hex)
        {
            int NumberChars = hex.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
        private static IBloomfilter Deserialize(byte[] param)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                ms.Write(param, 0, param.Length);
                IFormatter br = new BinaryFormatter();
                ms.Position = 0;
                return br.Deserialize(ms) as BloomFilter;
            }
        }
    }
这些代码按照您预期的方式运行,在功能上与您认为的u-sql实现没有什么不同,那么实际的脚本有什么问题吗


任何想法都欢迎

我认为你用这种方法做不到。 U-SQL代码将在“容器”上执行,并且您无权读取和写入文件,除非您使用提取器和输出器。 也许它可以在本地工作,但不能在Azure上工作

您可以在此处获得自定义运算符的示例: