Replaced moving ProductData byte[] with more generic stream writing/reading (since ProductData may have a different underlying type)